结构体(struct)的使用 - Tom不是猫的文章 - 知乎
C语言——指针与数组 - tetradecane的文章 - 知乎
何为指针?
指针,其本质就是一个存储内存地址的变量。指针运算符
指针运算符有两个,取内容(*)和取地址(&)。-
什么是一级指针?二级指针?
指针这种说法过于抽象,更好的理解方式是寻址,一级指针就是一次寻址,二级指针就是两次寻址。
image.png 一维数组和指针
二维数组和指针
-
一级指针表示二维数组
image.png
int a[2][3] = { { 1,2,3 },{ 4,5,6 } };
int *b = (int * )a;
cout << b[4] << endl; //5
int *b = a[0];
cout << b[4] << endl; //5
int *b = &a[0][0];
cout << b[4] << endl; //5
-
二级指针表示二维数组
image.png
思路:
将数组划分为两块,每一块的首地址由一个指针变量保存,需要两个指针变量;
再次申请一块内存空间,保存这两个指针变量,此内存空间的首地址由一个指针变量保存。
int a[2][3] = { { 1,2,3 },{ 4,5,6 } };
int m,n,i,j;
m=2;n=3;
int **p;
p=(int**)malloc(sizeof(int*)*m);//P是指针的指针 ,p申请了一块内存空间去保存两个指针地址
for(i=0;i<m;i++)
{
p[i]=(int*)malloc(sizeof(int)*n);//p[i]是指针,p[i]申请一块内存空间,去存放a[i][j]的值
//p[i]为指针
for(j=0;j<n;j++)
p[i][j]=a[i][j];
}
printf("%d\r\n",p[1][1]); //结果为5
printf("p的值%d\r\n",p);
printf("p[0]的地址%d\r\n",&p[0]);
printf("p[1]的地址%d\r\n",&p[1]);
return 0;
-
数组指针表示二维数组
image.png
思路:
将二维数组逻辑上划分为2个数组,定义一个数组指针b,b 是 int [3] 类型的指针,
即b保存了一个int [3]数组的首地址,所以*(b+1)表示移动到下一个数组的首地址,
*(*(b + 1) + 1)即为对应数组的下标处内容。
int a[2][3] = { { 1,2,3 },{ 4,5,6 } };
int (*b)[3] = a; //b 是 int [3] 类型的指针
cout << a[1][1] << endl; //5
cout << b[1][1] << endl; //5
cout << *(*(a + 1) + 1) << endl; //5
cout << *(*(b + 1) + 1) << endl; //5,b+1表示一次性移动int [3]个地址



