比如int型,以一个int型数据4个字节,内存的起始地址为1000来说
int a[5]的内存地址:
a[0] 1000
a[1] 1004
a[2] 1008
a[3] 1012
a[4] 1016
int a[2][3]的内存地址:
a[0][0] 1000
a[0][1] 1004
a[0][2] 1008
a[1][0] 1012
a[1][1] 1016
a[1][2] 1020
int a[2][2][3]
a[0][0][0] 1000
a[0][0][1] 1004
a[0][0][2] 1008
a[0][1][0] 1012
a[0][1][1] 1016
a[0][1][2] 1020
a[1][0][0] 1024
a[1][0][1] 1028
a[1][0][2] 1032
a[1][1][0] 1036
a[1][1][1] 1040
a[1][1][2] 1044
找找规律就懂了
其实也可以吧a[3][4]这个二维数组看成3个一维数组:a[3][4]={a[0],a[1],a[2]}
a[0]={0,1,2,3}
a[1]={4,5,6,7}
a[2]={8,9,10,11}
在这道题里标示符a代表a[0][0]的地址,标示符a[0]代表a[0][0]的地址,标示符a[1]代表a[1][0]的地址,标示符a[2]代表a[2][0]的地址 ->【解释】例如定义一个一维整型数组 int b[10]那么标示符b就能代表b[0](该数组的第一个元素)的地址,可以作为地址常量使用,类似指针。
printf("%d",a):题中a应该为a[0]的地址值,而a[0]为a[0][0]的地址值,所以a为a[0][0]的地址值。
printf("%d",*a):&为取地址符号,*为间接访问符号,主要用于指针,比如int m,*qq=&m*q就可以代表m了,*q的值就是m的值。题中*a为a[0]的值,可惜a[0]不是个数,a[0]代表a[0][0]的地址值,所以*a为a[0][0]的地址值。【但*a[0]代表a[0][0]的值,两者不要混淆】
printf("%d",a+1):指针可以和整数进行加减运算,运算结果仍是指针类型。比如定义一个一位数组 int b[10],*qq=&b[4]那么q代表b[4]的地址值,q+1代表b[5]的地址值,q+2代表b[6]的地址值。题中a+1代表a[1][0]的地址值(注意不是a[0][1])。
printf("%d",*(a+1)):之前说了,a+1代表a[1][0]的地址值,所以*(a+1)可以代表a[1][0],*(a+1)的值就是a[1][0]的值。
关于&就不多说了吧。。。打字好累。。。
// 定义int普通变量d,int指针变量e,fint d,*e,*f
// 指针e指向d的地址,即,e保存的是d的地址,而不是一个普通变量
e=&d
// 获取终端输入的一个整数,赋值给d(即,将终端获取的整数值写入scanf后面跟的地址中
scanf("%d",&d)
// 指针f也跟e一样,保存d的地址
f=e
以上,*e,*f,d实际上都是d
e,f,&d实际上都是d的地址