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???
- 其实
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;
读八个字节。 &a
&a[0]
都是一个地址值,就相当与一个指针的值一样,所以sizeof结果都为8&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])
代表首元素的首地址
下一篇分析数组与指针哟!!!