
指针是C语言的灵魂也是很多初学者的难点。不少人只记住一句话指针就是地址但遇到a 1、二维数组aa1这类笔试题就直接卡住。先记住核心原理指针的步长由指针的类型决定而不是地址本身地址只是内存编号指针类型决定指针1的时候内存要跳过多大一块空间。题目1一维数组经典指针题intmain(){inta[5]{5,4,3,2,1};int*ptr(int*)(a1);printf(%d,%d,*(a1),*(ptr-1));return0;}数组内存排布[5, 4, 3, 2, 1]a数组名代表首元素地址类型等价int*步长 1 个 int4 字节a1向后跳 1 个 int指向a[1]*(a1) 4a整个数组的地址类型是int (*)[5]数组指针指向长度为 5 的 int 数组a 11 直接跳过整个数组5 个 int20 字节跳到数组末尾后面的内存地址(int *)(a 1)强制转换成int*类型存入 ptrptr 现在步长变回单个 intptr -1向前退 1 个 int刚好落在数组最后一个元素a[4]值为 1重点坑点a和a的地址数值相同但是类型不同1的时候移动的字节数天差地别。题目 2二维数组进阶指针题intmain(){intaa[2][5]{10,9,8,7,6,5,4,3,2,1};int*ptr1(int*)(aa1);int*ptr2(int*)(*(aa1));printf(%d,%d,*(ptr1-1),*(ptr2-1));return0;}输出结果1,6二维数组在内存是连续平铺本质还是一块连续内存aa[0]10 9 8 7 6aa[1]5 4 3 2 1aa整个二维数组的地址类型int (*)[2][5]整个数组一共 10 个 intaa 1一次性跳过整个二维数组指向数组尾部之后ptr1 -1回退 1 个 int指向整个二维数组最后一个元素aa[1][4] 1aa是二维数组名等价aa[0]第 0 行的地址类型int (*)[5]一行 5 个 intaa 1跳过一行5 个 int指向aa[1]第 1 行的起始地址*(aa 1)对行指针解引用得到第 1 行首元素地址aa[1][0]对应值 5ptr2 -1向前退 1 个 int就来到上一行的末尾aa[0][4] 6结语指针学习不要死记硬背答案核心抓住指针类型决定步长这个底层逻辑。一维、二维数组的指针题目本质都是同一个原理。搞懂这两道题笔试遇到同类题目都可以直接套用这套分析思路。