2.ホールの下の演習
1.文字列とポインタ
次のプログラムの結果を書き込んでください
#include<stdio.h>
int main( )
{ char string[30]="How_are_you" ;
char *p=&string[0], *p2=string+8;
printf("%s,%s\n" , p , p2 ) ;
}
プログラムの実行結果は次のとおりです。
#include <stdio.h>
int main()
{
printf("_______________________");
}
アイデア:* pはポインター宣言シンボルであり、テーブル名pはポインター変数です。変数のアドレスまたはポインターの最初のアドレスをp変数に割り当てる場合、それはpのポインター変数がこの値を指すことを意味します。文字列は最後まで読み込まれます。
回答:How_are_you、あなた
2.配列のポインターの
問題:次の配列定義が提供されています:int a [3] [4] = {{1,3,5,7}、{9,11,13,15}、{17,19,21 、23}};次の項目の値を計算します(配列aの最初のアドレスを2000に設定し、int型の数値は4バイトを占有します)。
プログラムを記述し、要求ごとに1行を出力します。
(1)a[2][1] (2)a[1] (3)a (4)a+1
(5)*a+1 (6)*(a+1) (7)a[2]+1 (8)*(a+1)+1
(9)*(*(a+2)+2)
回答:
#include<stdio.h>
int main(){
printf("19\n");
printf("2016\n");
printf("2000\n");
printf("2016\n");
printf("2004\n");
printf("2016\n");
printf("2036\n");
printf("2020\n");
printf("21\n");
return 0;
}
分析:
数组: 数组下标:
1 3 5 7 00 01 02 03
9 11 13 15 10 11 12 13
17 19 21 23 20 21 22 23
(1)a[2][1]的值
(2)a[1],代表第二行的首地址,2000+4*4=2016
(3)a,代表a[0][0]的地址,2000
(4)a+1,代表a[1][0]的地址,2016
(5)*a+1,代表a[0][1]的地址,2000+4=2004
(6)*(a+1) ,代表a[1][0]的地址,2016
(7)a[2]+1 ,代表a[2][0]的地址的下一位,即a[2][1]的地址,2000+4*9=2036
(8)*(a+1)+1,*(a+1)为第二行的首地址即a[1][0],然后再把这个地址+1,即a[1][1]的地址,2016+4=2020
(9)*(*(a+2)+2),*(a+2)为a[2][0]的地址,*(a+2)+2为a[2][2]的地址,最外面加*,为a[2][2]的值21.