二级指针
一级指针指向的是变量的首地址,二级指针指向的是一级指针的首地址。
整型变量a;一级整型指针变量p;二级整型指针变量s。
s本身是p的地址;p本身是a的地址;a本身是数据0。
*s是p本身;*p是a本身。
**s是a本身。
int main()
{
int a = 0;
int* p = &a;
int** s = &p;
printf("%d \n", a);
printf("%p \n", p);
printf("%p \n", s);
**s += 1;
*s += 1;
s += 1;
printf("%d \n", a);
printf("%p \n", p);
printf("%p \n", s);
return 0;
}
二维数组
ar[4]是有4个整型变量的数组。
ar指的是数组中首元素的首地址,&ar指的是数组的首地址。
ar与&ar是相同的。
ar+1指向的是第二个元素的首地址,地址+4;
&ar+1指向的是第二个有4个整型变量的数组的首地址,地址+16。
ar[3]<==>*(ar+3)
二维数组就是指数组中的元素都是类型相同、大小相同的一维数组。
例如:int ar[4][4]就是一个有四个元素的整型二维数组,其中每个元素都是一个一维整型数组,每个一维整型数组中包含四个整型元素。
二维数组在内存中存储情况如下:

二级指针和二维数组
*(*(ar+2)+3)因为*(ar+2)=>ar[2],所以等价于*(ar[2]+3),再次等价于ar[2][3]。
int main()
{
int ar[5][2] = { 1,2,3,4,5,6,7,8,9,10 };
int(*s)[2] = &ar[0];
int* p = ar[0];
printf("%d \n", s[1][3]); //*(*(s+1)+3) ==> 6
printf("%d \n", p[3]); //*(p+3) ==> *(ar[0]+3) ==> *(*(ar+0)+3) ==> 4
return 0;
}
int main()
{
int ar[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
int size = sizeof(ar); //48 = 4(int)*3(一维数组的个数)*4(一维数组中元素的个数)
int(*s)[4] = ar; //限制了s+1的能力,s+1,加的是sizeof(ar[4]),16字节
int** p; //p+1,加的是sizeof(int),4字节
int x = ar[2][3];
x = *(ar[2] + 3);
x = *(*(ar + 2) + 3);
s + 2;
*(s + 2);
*(s + 2) + 3;
*(*(s + 2) + 3);
x = *(*(s + 2) + 3);
x = *(s[2] + 3);
x = s[2][3];
return 0;
}

本文介绍了二级指针的概念,它指向一级指针的首地址。同时阐述了二维数组的特性,如ar与&ar相同,ar+1和&ar+1的区别。还讨论了二维数组在内存中的存储方式,并通过例子解析了二级指针如何操作二维数组。
3663

被折叠的 条评论
为什么被折叠?



