// 多级指针
# include <stdio.h>
int main(void)
{
int i = 1;
int * p;
int ** q;
p = &i;
q = &p;
printf("i = %d, p = %d, q = %d
", i, p, q);
printf("*p = %d, &i = %d, &p = %d
", *p, &i, &p);
printf("**q = %d, *q = %d, &q = %d
", **q, *q, &q);
return 0;
}
/*
程序输出结果:
i = 1, p = 6487628, q = 6487616
*p = 1, &i = 6487628, &p = 6487616
**q = 1, *q = 6487628, &q = 6487608
--------------------------------
Process exited after 0.01289 seconds with return value 0
请按任意键继续. . .
结论:
多级指针就是储存了一个指针变量地址的指针变量。
*/
// 多级指针与静态变量的缺陷
# include <stdio.h>
void f(int ** q)
{
int i = 5;
**q = i;
return;
}
int main(void)
{
int * p;
f(&p);
printf("%d", *p); // 此处逻辑错误
return 0;
}
/*
本程序编译正确,但却无法执行,原因是语法上没有错误,但逻辑上有错。
错误语句为 printf("%d", *p); 此处的 *p 有问题,原因是 *p 相当
于 i 变量,但程序在执行完被调函数 f 后,就将 i 的内存释放了,接下
来 i 就不属于此程序的内存,而 *p 访问的是已被释放的内存 i ,这样
就出现了错误。
*/
类比于上一个程序。
// 多级指针与动态变量
# include <stdio.h>
# include <malloc.h>
void f(int ** q)
{
*q = (int*)malloc(sizeof(int));
**q = 5;
return;
}
int main(void)
{
int * p;
f(&p);
printf("%d", *p);
free(p); // 释放 p 所指向的内存。
return 0;
}
/*
程序输出结果:
5
--------------------------------
Process exited after 0.02017 seconds with return value 0
请按任意键继续. . .
由于使用了 malloc 函数,构造了一个动态变量,而动态变量需要手动释放
可以跨函数使用。
*/