一维数组
C语言定义:int arr[10] = {0};
arr是数组名,它的值是一维数组首元素的地址,但它不是指针,仅仅是个符号
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
printf("%p\n", arr); // 输出arr的值,也就是数组首元素的地址
printf("%p\n", &arr[0]); // 输出数组首元素的地址
return 0;
}
【注意】两个例外:
sizeof(arr) ---- 表示输出整个一维数组的大小,如上例输出 40 byte。
&arr --- 表示输出整个一维数组的地址(结果和&arr[0],arr的输出结果一致),区别在&arr+1中体现出来
第13行是数组首元素的下一个元素的地址,及arr确实存放的是数组首元素的地址,加一即向后移动一个数组类型(int)的大小。
第14行也是数组首元素的下一个元素的地址,还有个意外收获,即&的优先级低于指针移动的操作符的优先级。
第15行,区别就显现出来了,与第11行输出的相差了0x28,也就是2*16+8*1 = 40(byte),这说明&arr+1跳过了一整个数组的大小,由此说明&arr取出的是整个数组的地址,而非数组首元素的地址,这两个理解角度有着本质的区别,尽管第10行和第11行代码的输出结果看似一致。
二维数组
C语言定义:int arr[3][4] = {0}; // 行可省略,列不可省