#include<stdio.h>#include<stdlib.h> #include<string.h> int main() { int array[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; int(*pArray)[4] = array; printf("%d ", *(pArray[0] + 1)); printf("%d ", **(pArray + 1)); pArray++; printf("%d ", *(*pArray + 1)); system("pause"); return 0; }
复制代码知识解析
主要使用到的知识如下:
- C语言数组指针: 一个指向数组的指针
- C语言中指针如何表示二维数组
- C语言指针的的运算: p+n的理解
数组指针
即是指向数组的指针。例:int (*p)[4]; p即为指向数组的指针,又称数组指针。数组指针是指向数组地址的指针,其本质为指针;指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。数组指针的使用在某些情况下与指针数组很相似,要注意区别。
指针如何表示数组
一维数组中有如下重点:

当一级指针p指向数组array时,*(p+i)等效于array 等效于p
二维数组中有如下重点:

C语言指针运算
指针p+n 解释为: p+sizeof(指针所指向的类型)*n;说到这里不得不讲下C语言指针中的两个重要类型了。如果存在指针 int *p 则有如下两个类型:
- 指针的类型: 去掉变量 ,剩下的就是类型,故是 int *;
- 指针所指向的类型: 去掉*和变量名即可得到地址对应的内存中的存储的数据类型,即int类型。
题目分析:
#include<stdio.h>#include<stdlib.h> #include<string.h> int main() { int array[3][4] = { 1, 2, 3,4, 5, 6, 7,8, 9, 10, 11, 12 }; int(*pArray)[4] = array; printf("%d ", *(pArray[0] + 1)); printf("%d ", **(pArray + 1)); pArray++; printf("%d", *(*pArray + 1)); system("pause"); return 0; }
复制代码(pArray + 1) 移动的字节数: pArray+sizeof(int[4])*1,表示第一行(数组从第0行开始计数)第一个位置的地址,故**(pArray + 1) 得到的应该是第1行第一个元素,即打印5
pArray++后 pArray示第一行(数组从第0行开始计数)第一个位置的地址 ,而在数组中p[0] 并不一定表示第0行或者第0列哦,而是以p的当前地址中的偏移位置,故*(*pArray + 1)代表当前地址的第1个元素,故打印6 。综上打印结果是2 5 6 。
运行测试

来源:C语言基础