一.数组核心规则总结1. 数组名退化核心规则C 语言中数组名在绝大多数表达式中会退化为指向数组首元素的指针仅 2 个例外例外 1sizeof(数组名)数组名表示整个数组计算的是整个数组的总字节数。例外 2数组名数组名表示整个数组取出的是整个数组的内存地址。2. 二维数组的 3 层指针层级如int arr[2][3] { 1,2,3,4,5,6 };则下面的表达式分别为3. 指针 1 的本质指针1的偏移量永远由指针指向的元素类型的大小决定和指针本身的字节数32/64 位无关。二.代码#define_CRT_SECURE_NO_WARNINGS#includestdio.hintmain(){// *****************************************************************************************/* 数组名退化核心规则 C 语言中数组名在绝大多数表达式中会退化为指向数组首元素的指针仅 2 个例外 例外 1sizeof(数组名)数组名表示整个数组计算的是整个数组的总字节数 例外 2 数组名数组名表示整个数组取出的是整个数组的内存地址 */// *****************************************************************************************// 二维数组定义2行3列内存中连续线性存放intarr[2][3]{1,2,3,4,5,6};// 1. 数组名arr退化为指向首行一维数组的指针// 类型int (*)[3]值为整个二维数组的首地址 arr[0][0]printf( arr is %p\n,arr);// 2. arr取整个二维数组的地址// 类型int (*)[2][3]值和arr相同但指针步长是整个二维数组的大小printf( arr is %p\n,arr);// 3. arr1跳过1个完整的一维数组// 步长3*412字节指向第二行arr[1]的首地址printf( arr1 is %p\n,arr1);// 4. arr1跳过整个二维数组的全部内存// 步长2*3*424字节指向整个数组结束后的下一个内存地址printf( arr1 is %p\n,arr1);// 5. arr[0]1第一行数组退化为int*指针1跳过1个int元素// 步长4字节指向arr[0][1]的地址printf( arr[0]1 is %p\n,arr[0]1);// 6. arr[0]1取第一行数组的地址1跳过1个完整的一维数组// 类型int (*)[3]步长12字节和arr1输出完全相同printf( arr[0]1 is %p\n,arr[0]1);// 错误示例arr[0][0]是int类型的数值1不是内存地址不能用%p输出// printf( arr[0][0]1 is %p\n, arr[0][0] 1);// 7. arr[0][0]1取首行首元素的地址1跳过1个int元素// 类型int*步长4字节和arr[0]1输出完全相同printf(arr[0][0]1 is %p\n,arr[0][0]1);return0;}三.运行结果