二级指针
2021-10-09 本文已影响0人
lxr_
#include <stdio.h>
int main(int argc, char** argv)
{
int num = 520;
int* p = # //指针p存放num的地址
int** pp = &p; //二级指针pp存放指针p的地址
printf("num:%d,*p:%d,**p:%d\n", num, *p, **pp); //num:520,*p:520,**p:520 三者相等
printf("&p:%p,pp:%p\n", &p, pp); //&p:0053F730,pp:0053F730 两者相等,每次运行结果不一样
printf("&num:%p,p:%p,*pp:%p\n", &num, p, *pp); //&num:0135F9EC,p:0135F9EC,*pp:0135F9EC 三者相等,每次运行结果不一样
//指针数组和二级指针
char* str[] = { //该指针数组存放的都是地址,字符串用指向第一个字符的指针来表示
"hello",
"world",
"xian"
};
//数组中都是指针,且数组又可以用指针来访问,故可以用二级指针(指向指针的指针)指向指针数组
char** pStr1[2];
char** pStr2;
pStr1[0] = &str[0]; //str[0]为字符串首地址,再次取地址即为二级指针
pStr1[1] = &str[1];
pStr2 = &str[2];
printf("pStr2:%s\n", *pStr2); //pStr2:xian
printf("pStr1:\n");
for (int i = 0; i < 2; i++)
{
printf("%s", *pStr1[i]); //helloworld
}
printf("\n");
//************数组指针和二维数组***************
int array[2][3] = {
{0,1,2},
{3,4,5}
};
int** pa = array;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
//printf("%2d", *(*(pa + i) + j)); //程序崩溃,因为pa每次加1其跨度为sizeof(int)=4个字节,无法访问第i行第j列
printf("%2d", *(*(array + i) + j));//可正确访问 第i行第j列,array加1跨度为sizeof(int)*3=12字节
// 0 1 2
// 3 4 5
}
printf("\n");
}
printf("pa: %p,pa+1:%p\n", pa, pa + 1); //pa: 006FFAF0,pa+1:006FFAF4 相差4个字节
printf("array:%p,array+1:%p\n", array, array + 1); //array:006FFAF0,array+1:006FFAFC 相差12个字节
//********正确利用指针指向二维数组:数组指针,而不是二级指针***********
int(*ppa)[3] = array; //加&或不加&都可以,两者都一样,数组名本身就是地址,建议此处不加,意义更明确,array指向的是第一行整个数组
printf("%p %p\n", array, &array); //两个值相等
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%2d", *(*(ppa + i) + j)); //数组指针每次加1的跨度与array一样,为sizeof(int)*3=12个字节,故可以正确访问第i行第j列
// 0 1 2
// 3 4 5
}
printf("\n");
}
return 0;
}