C语言中编译器不会为数组名分配内存,只会为数组中的每个元素分配内存(与指针的区别);对数组的访问可以通过指针或者下标的形式,但是不能直接对整个数组进行操作,也就是说数组名不能作为一个左值进行操作。下面对数组常见的几个问题进行代码示例。
数组的sizeof
void array_size(int a[])
{
printf("int a[10] as a parameter:\n");
printf("sizeof(a) = %d\n", sizeof(a));
int b[10];
printf("int b[10]:\n");
printf("sizeof(b) = %d\n", sizeof(b));
}
函数输出为:
int a[10] as a parameter:
sizeof(a) = 4
int b[10]:
sizeof(b) = 40
sizeof(a) = 4 是因为数组作为函数参数会退化为指针类型,而sizeof(b) = 40则为数组b所占的内存空间大小。
2. 数组有关的地址问题
void array_addr()
{
int a[10];
printf("int a[10]:\n");
printf("&a = %p\n", &a);
printf("a = %p\n", a);
printf("&a[0] = %p\n", &a[0]);
printf("&a[0]+1 = %p\n", &a[0]+1);
printf("&a+1 = %p\n", &a+1);
}
函数输出为:
int a[10]:
&a = 0xbfebae08
a = 0xbfebae08
&a[0] = 0xbfebae08
&a[0]+1 = 0xbfebae0c
&a+1 = 0xbfebae30
&a表示的是数组a的首地址,直接输出a的值,其实就是数组首元素的地址,所以可以看到&a,a,&a[0]三者在值上是一致的。&[0]+1表示a[0]的下一个元素,即 a[1]的地址,而&a+1则表示整个数组a的下一个(说起来有点别扭,其实就是数组首地址偏移上数组尺寸即sizeof(a)的值)。
来源:oschina
链接:https://my.oschina.net/u/163849/blog/186034