请思考以下程序:
#include <stdio.h>
void f(int ** q) //q是个指针变量,无论q是什么类型的指针变量,都只占4个字节
{
int i = 5;
//*q等价于p q和**q都不等价于p
//*q = i; //error 因为*q = i; 等价于 p = i; 这样写是错误的
*q = &i; // p = &i;
}
int main(void)
{
int *p; //13行
f(&p);
printf("%d\n", *p); //16行 本语句语法没有问题,但逻辑上有问题
return 0;
}
1.先运行主函数,分配静态内存给P指针变量(用来存放其他变量的地址)
2.调用f()函数,f(int** q)形参变量是二级指针变量q(存放指针变量的地址)
3.输出显示*P(取p指向的值) 能实现吗?
注意:
- &p是对p取地址,p本来定义成一级指针,现在再取地址&,变成二级指针。与 int** q同等身份。
- 在主函数中调用f(&p)传输到f(int** q)函数里面
- 在f(int** q)函数中,进行操作:装有'5'的变量i的地址赋给 *q(*代表进行一次指向访问,从二级指针消耗一次'指向'变为了一级指针,可以用来装入内容是'5'的变量i的地址)
- 同时,*q(1级)等价于p(1级),相当于通过中间人二级指针q消耗一次指向,把&i(i的地址)赋值给了一级指针*q,再传给p,完成了p指向i的功能。
- 最后,printf("%d \n",*p)用*p,来进行指针访问所指向的 i变量,目的是想要显示5
4.然而最后并不能实现显示5,原因如下
在主函数中执行f(&p)结束的时候,函数f()里面的静态变量i已经释放内存(操作系统不再分配给这个我们编写的程序使用);因此无权通过 *p 来访问已经释放内存的i变量的值,何谈显示。