说明多级指针与动态变量,静态变量关系的几个简单程序

// 多级指针

# 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 函数,构造了一个动态变量,而动态变量需要手动释放
 可以跨函数使用。
 */