知识点回顾:
1. 指向指针的指针
只要你懂得了指针的概念,那么指向指针的指针也就没什么了不起了。
举个栗子:
#include <stdio.h>
int main()
{
int num = 520;
int *p = #
int **pp = &p;
……
return 0;
}
上边代码中,p 定义的是指向整型的指针,也就是说指针变量 p 里边存放的是整型变量 num 的地址。所以,*p 就是对指针进行解引用,得到了 num 的值。而 pp 就是指向指针的指针,pp 存放的是指针变量 p 的地址。所以,对 pp 进行一层解引用(*pp)得到的是 p 的值(num 的地址),对 pp 进行两层解引用(**pp)相当于对 p 进行一层解引用(*p),得到整型变量 num 的值。
2. 指针数组和指向指针的指针
使用指向指针的指针来指向数组指针,至少有两个优势:
· 避免重复分配内存(虽然我们进行了多个分类,但每本书的书名只占据一个存储位置,没有浪费)
· 只需要进行一处修改(如果其中一个书名需要修改,我们只需要修改一个地方即可)
这样,代码的灵活性和安全性都有了显著地提高。
3. 再讲数组指针和二维数组
如何利用指针来指向二维数组呢?
答:需要使用数组指针。
#include <stdio.h>
int main()
{
int array[3][4] = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11}};
int (*p)[4];
int i, j;
p = array;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("%2d ", *(*(p+i)+j));
}
printf("\n");
}
return 0;
}
程序实现如下:
分析:
p 是一个指向数组的指针,这个数组包含了 4 个元素,所以 p的跨度是 4 * sizeof(int),然后把二维数组第一个元素的地址赋值给 p。这时,p+1 恰好是二维数组一行的跨度。对 p+1 进行解引用,得到的就是二维数组第二行第一个元素的首地址。所以我们可以通过数组指针的方式来访问二维数组。
大家发现,随着我们课程的深入,对指针的剖析也是越发的惊心动魄,所以可能有时候大家学着学着觉得懵圈了,这很正常,你需要摸着自己的胸部,然后问一下自己:每节课学完之后有没有认真总结思考,有没有按时完成课后作业,还是说只是为了看视频而看视频?我总感觉一天看五六节课的童鞋,会错过很多思考和练习的机会。
记住,欲速则不达!C语言是一门值得你深入探讨的优秀编程语言,它不是快餐。




