目录
一、二级指针
首先,知道什么是一级指针。如下代码:
int main()
{
int a = 10;
int* pa = &a;
return 0;
}
上述代码中,pa是一个指针变量,用来存放a的地址的变量。而这里的pa就是一个一级指针变量。
一级指针变量意思是,我们在进行解引用时,只需要对pa解引用一次就可以找到a.
即:*pa就是a
代码如下:
int main()
{
int a = 10;
int* pa = &a;
*pa = 20;
printf("%d\n", a);
return 0;
}
看运行结果:
输出20,说明确实通过*pa改变了a的值。
思考:
a是一个变量,我们将a的地址存放在pa里,而pa也是一个变量(指针变量),我们是不是也可以将pa的地址存放到一个变量里面去 ?
不可以?可以哒!想一下,指针就是地址,地址就是编号,其实就是一串数字,而这串数字在内存中,也有自己的地址,我们将这串数字的地址存放到一个变量里面去,即,将pa这个指针变量的地址存放到一个变量里面去。
如下代码:
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa;
return 0;
}
这里的ppa就是一个二级指针变量。
二级指针变量意思是,我们在进行解引用时,只需要对ppa解引用两次就才可以找到a。先对ppa解引用找到pa,再对pa解引用找到a.
代码:
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa;
**ppa = 20;
printf("%d\n", a);
return 0;
}
运行结果:
输出20,说明确实通过**ppa改变了a的值。
再度理解:
对于int* pa=&a;中的*说明pa是一个指针,而pa指针所指向的对象是int类型的;
对于int* * ppa=&pa;中,第二个*说明ppa是指针,而第一个*与int合起来,说明ppa所指向的对象是int*类型的。
每个*都有自己的含义
总结:二级指针变量是用来存放一级指针变量的地址。
错误理解:二级指针是地址的地址。
二、指针数组
指针数组的主语是数组
含义:存放指针的数组其实就是指针数组
举例:
int main()
{
int a = 10;
int b = 20;
int c = 30;
int* pa = &a;
int* pb = &b;
int* pc = &c;
return 0;
}
在这里,我们是将a,b,c这样的变量一个一个的存放进创建的指针变量里面,但是在这里大家想一想,如果想要创建的指针变量过多,我们再向上面一样创建是不是太麻烦了。思考之前学过的数组,当我们创建的整型太多的时候,我们会想到利用数组来表示,所以在这里,我们需要创建的指针变量过多的时候,我们也可以利用指针数组来表示。
如下:
int main()
{
int a = 10;
int b = 20;
int c = 30;
int* arr[3] = { &a,&b,&c };
return 0;
}
在这里,arr就是存放指针的数组。
打印如下:
int main()
{
int a = 10;
int b = 20;
int c = 30;
int i = 0;
int* arr[3] = { &a,&b,&c };
for (i = 0; i < 3; i++)
{
printf("%d ", *arr[i]);
}
return 0;
}
显示找到元素的地址,然后解引用,就可以找到相应的元素。
可以利用指针数组模拟一个二维数组。
int main()
{
int arr1[2] = { 1,2 };
int arr2[2] = { 3,4 };
int arr3[2] = { 5,6 };
int* arr[3] = { arr1,arr2,arr3 };
return 0;
}
理解:
打印:
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 2; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
初识指针到这里就结束了,进阶内容更加精彩哦!希望多多支持,一起加油诶!