15.指针深入学习_D【郝斌C语言入门学习】

多级指针

例题1:

 

 1 # include <stdio.h>
 2 int main(void)
 3 {
 4     int i = 10;
 5     int * p = &i;
 6     int ** q = &p;
 7     int *** r = &q;
 8 //    r = &p;//错误,因为r是int ***类型,r只能存放int ** 类型的地址
 9     printf("i = %d\n", ***r);
10     return 0;
11 }

 

例题2:

 

# include <stdio.h>
void f(int ** q)
{
    //*q就是p
}
void g()
{
    int i = 10;
    int * p = &i;
    f(&p);
}
int main(void)
{
    return 0;
}

 

跨函数使用内存

例题1:静态分配内存不能跨函数使用

 

 1 # include <stdio.h>
 2 void f(int ** q)//q是个指针变量,无论q是什么类型的指针变量,都只占4个字节
 3 {
 4     int i = 5; //静态变量不能跨函数使用
 5     //*q 等价于p 
 6     *q = &i;
 7 }
 8 int main(void)
 9 {
10     int *p;
11     f(&p);
12     printf("%d\n", *p);//本语法没有问题,但逻辑上有问题,因为i变量在f()函数终止时已经被释放。
13     return 0;
14 }

 

例题1:动态分配内存可以跨函数使用

 1 # include <stdio.h>
 2 # include <malloc.h>
 3 void f(int ** q)
 4 {
 5     int * pArr = (int *)malloc(sizeof(int));
 6     //函数中用malloc方法动态分配内存可以跨函数使用,而函数中静态分配内存在本函数终止即被释放
 7     *pArr = 300;
 8     *q = pArr;
 9 }
10 int main(void)
11 {
12     int * p;
13     f(&p);//跨函数修改p的值,必须发送p的地址才能修改
14     printf("%d\n", *p);
15     return 0;
16 }
17 /*
18     在vc++6.0中的输出结果:300
19     main()函数通过指针变量p访问f()函数动态分配空间,这就是跨函数使用内存空间的实例。
20 */

 

posted @ 2024-08-17 13:22  java帝国  阅读(20)  评论(0)    收藏  举报