C语言的数组元素地址计算

Python012

C语言的数组元素地址计算,第1张

要看数组的类型

比如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,f

int 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的地址