参考:多级指针(静动态内存的跨函数访问)
作者:枕上
发布时间:2021-07-15 00:27:17
网址:https://blog.csdn.net/jinchi_boke/article/details/118724993?spm=1001.2014.3001.5501
目录
- 多指针初认识:
- 动态内存和多级指针的跨函数访问
- 动态内存和静态内存的比较:
- 静态内存不可以跨函数访问:
- 动态内存跨函数访问:
多指针初认识:
#include <stdio.h>
#include <stdlib.h>
int main()
{int i = 100;int *p = &i;int **q = &p;int ***r = &q;//r = &p; //error 因为r是 int*** 类型,r只能存放 int** 类型变量的地址printf("i = %d\n",***r); system("pause");return 0;
}
输出结果:
i = 100
动态内存和多级指针的跨函数访问
#include <stdio.h>
#include <stdlib.h>void f(int **p)
{*p = 10;
}int main()
{int *p = (int *)malloc(4);f(&p); printf("*p = %d\n",p);system("pause");return 0;
}
输出结果:
*p = 10
动态内存和静态内存的比较:
静态内存是由系统自动分配,由系统自动释放
静态内存是在栈分配的
动态内存由程序员手动分配,手动释放
动态内存是在堆分配的
静态内存不可以跨函数访问:
通俗说就是:当被调用的函数结束后,被调用函数里面的静态内存不能被其他函数访问。
#include <stdio.h>
#include <stdlib.h>void f(int **q)
{int i = 10;//*q等价于p q和**q都不等价于p//*q =i;//error 因为*q = i等价于p = i;这样写是错误的*q = &i; //等价于 p = &i;
}int main()
{int *p;f(&p);printf("%d\n",*p); //本语句语法没有问题,但是逻辑上有问题system("pause");return 0;
}
输出结果:
10
这个程序运行是能正常输出的,但是程序是错误的,逻辑上有错误。
因为当 f( ) 函数执行完毕之后,函数终结(也就是函数的出栈),此时函数静态分配的变量的空间会被全部释放,静态变量的空间访问权限会还给操作系统,我们不能再对他进行读写操作。具体到这个 f( ) 函数就是 ,变量 q 没了,变量 i 没了, i 的值 10 也没有了。也可以说 p 指向 的 变量 i 的空间没了。
那么main 函数 就不能访问 i 的值,也就是 printf("%d\n",*p) 中的 *p 逻辑上是不可以的。
但是 指针P 可以存放着 i 的地址。但是不能访问 i 的空间,没有权限进行读写操作。
动态内存跨函数访问:
malloc堆分配的动态内存,不会随着函数的结束而被释放,只有手动free才会被释放
#include <stdio.h>
#include <stdlib.h>void f(int **q)
{*q = (int *)malloc(sizeof(int)); //等价于 p=(int *)malloc(sizeof(int)) //q = 10; //error//*q = 10; //等价于 p = 10;**q = 10; //等价于 *p = 10;
}int main()
{ int *p = (int *)malloc(4);f(&p); printf("*p = %d\n",*p);system("pause");return 0;
}
输出结果:
*p = 10