目录
多指针初认识:
#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;
}
动态内存和多级指针的跨函数访问
#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;
}
动态内存和静态内存的比较:
静态内存是由系统自动分配,由系统自动释放
静态内存是在栈分配的
动态内存由程序员手动分配,手动释放
动态内存是在堆分配的
静态内存不可以跨函数访问:
通俗说就是:当被调用的函数结束后,被调用函数里面的静态内存不能被其他函数访问。
#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;
}
这个程序运行是能正常输出的,但是程序是错误的,逻辑上有错误。
因为当 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;
}