多级指针
多级指针还是指针,保存了上级指针的地址值
# include<stdio.h>
# include<malloc.h>
void xp(int **);
void main(void)
{
int i=10; //系统分配了四个字节保存了10;
int * p=&i; // 把i的内存地址保存给p
int ** q=&p; //把p的地址保存给了q
int *** k=&q; //把q的地址保存给了k
printf("%d\n",***k);//输出结果就是10;
//可以理解成老师提问学生:例如:*p取p内存的内容即i的地址值,老师大声问这是谁的地址啊,i站起来说是自己的。老师说是你的那就给你吧。所以*p=i了
//再例如:*k取k内存中保存的值即q的地址值,老师问这是谁的地址啊,q说是自己的,所以*k=q了。
//那么**k=*q=p了;***k=**q=*p=i;所以输出结果就是10;
//现在要修改p指针,必须要取p的地址,&p的类型为int **;
xp(&p);
printf("%d\n",*p);
}
void xp(int ** d)
{
//int m=20;
//*d=&m;//这里就把p的值修改了,*p=&m;但是这个内存是在函数中定义的,当函数出栈的时候内存释放了,如果系统再次把这个内存分给其他的变量的时候就会出问题。
//所以这里要使用动态分配内存,因为动态分配是分配在堆内存当中的。函数出栈不受影响。
*d=(int *)malloc(sizeof(int));//动态在堆内存中分配了一个4个字节的内存。malloc(int)这个函数只返回分配内存的第一个字节的地址值,需要强制转换成int *;
**d=20;
}