数组地址含义问题

int main()
{
	//1
    int *p = NULL;
    printf("sizeof(p) = %d	", sizeof(p));	      
    printf("sizeof(*p) = %d	", sizeof(*p));			
    
    int a[100];
    //2
    printf("sizeof(a) = %d	", sizeof(a));			
    printf("sizeof(a[100]) = %d	", sizeof(a[100]));	
    printf("sizeof(&a) = %d	", sizeof(&a));	
    printf("sizeof(&a[0]) = %d	", sizeof(&a[0]));	
    //3
    printf("&a = %x	", &a);					
    printf("&a+1 = %x	", &a+1);				
    printf("&a[0] +1 = %x	", &a[0]+1);
    printf("a+1 = %x\n", a+1);
}

输出结果为:

sizeof(p) = 8	 sizeof(*p) = 4	
sizeof(a) = 400	 sizeof(a[100]) = 4		 sizeof(&a) = 8 	    sizeof(&a[0]) = 8
&a = ec07db80	 &a+1 = ec07dd10         &a[0]+1 = ec07db84     a+1 = ec07db84

得出这个实验结果的时候,我就很纳闷了,为啥 a+1 = 首地址+sizeof(int), sizeof(a+1) = 400???

  1. 其实 int a[100] ; 其实应该写成这个样子int[100] a; 准确的说a是100个int类型空间的名字,就像int c;c是1个int类型空间的名字一样; 其实在这里我说的并不太准确,准确地说,a是a数组首元素的首地址,int 告诉我们要读取a数组元素的的时候的读到哪里,还是拿int c举例,c代表这块空间的首地址,int 告诉我们定义的时候分配多少,读取的时候读到哪里,读几个字节,char c;,读一个字节,double c;读八个字节。
  2. &a &a[0]都是一个地址值,就相当与一个指针的值一样,所以sizeof结果都为8
  3. &a为数组的首地址,a为数组首元素的首地址。

如果你真的理解了这段代码,不防考虑一下在二维数组,然后在看一看是否符合你的预期

二维数组

    int c[3][4];
    printf("sizeof(c) = %d  ", sizeof(c));
    printf("sizeof(c[3]) = %d  ",sizeof(c[3]));
    printf("sizeof(&c) = %d   ", sizeof(&c));
    printf("sizeof(c[3][4]) = %d\n", sizeof(c[3][4]));

    printf("&c = %x\n", &c);
    printf("&c+1 = %x\n", &c+1);
    printf("c+1 =%x\n", c+1);
    printf("c[0]+1 %x\n", c[0]+1);
    printf("&c[0][0]+1 = %x\n", &c[0][0]+1);

输出结果如下:

sizeof(c) = 48  sizeof(c[3]) = 16  sizeof(&c) = 8   sizeof(c[3][4]) = 4
&c = 12e588d0
&c+1 = 12e58900
c+1 =12e588e0
c[0]+1 12e588d4
&c[0][0]+1 = 12e588d4

同样的
1.对int c[3][4] 来说,c是一个int [3][4]类型的数据类型的名字,所以sizeof(c) = 48即4 *3 *4,
2. 而对c[3] 来说,他的类型是int [4],所以sizeof(c[3]) = 16 即4 * 4 .
3. 而&c就只是一个地址值,同样的&c[0],&c[0][0]也都是地址值相当与一个指针的值,所以sizoef(&c) = 8, sizeof(&c[0]) = 8, sizeof(&c[0][0]) = 8
4. c[3][4]就是一个int类型的整数,所以等于4.

接下来分析一下地址值
对于编译器来说总是将一个二维数组看成是一个一维数组,而一维数组的每个元素又都是一个数组。
5. &c代表 二维数组首地址,c (&c[0])代表二维数组首行元素的首地址,c[0] (&c[0][0])代表首元素的首地址
下一篇分析数组与指针哟!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值