二级指针那点事
现在让我们来看看什么什么是二级指针
node**c
一个关于指针小实验
下面做一个小实验
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int a;
struct node *next;
}node;
void Initlinklist(node *p)
{
if(p==NULL)
{
p=(node*)malloc(sizeof(node));
}
p->a=0;
p->next=NULL;
}
int main()
{
node*p=NULL;
//IninLinklist就是一个链表的初始化函数
Ininlinklist(p);
if(p==NULL)
{
printf("NULL");
}
else{
printf("good");
}
system("pause");
return 0;
}
他的输出为:
NULL
很神奇对不对,为什么我用了指针,去初始化函数里面在堆区申请内存给p,他返回还是为
NULL
老师不是说传入指针就可以了吗?然后传入初始化函数后在堆区分配内存空间给p呢
的确老师讲的是这样的但是确不是完全是这样
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int a;
struct node *next;
}node;
void Initlinklist(node *p)
{
if(p==NULL)
{
p=(node*)malloc(sizeof(node));
}
p->a=0;
p->next=NULL;
}
int main()
{
node*p;
//IninLinklist就是一个链表的初始化函数
Ininlinklist(&p);
if(p==NULL)
{
printf("NULL ");
}
else{
printf("good ");
}
if(p->next=NULL)
{
printf("NULL");
}
else{
printf("good ");
}
system("pause");
return 0;
}
现在这样他就会输出(为了证明他进入了函数我又加了一个p->next的判断)
good NUll
这就让人费解了,然后当我们进行仔细观察
如果我们把上面Initlinklist中的
if(p==NULL)
{
p=(node*)malloc(sizeof(node));
}
这一段给去掉他得到的结果没有变化,这是为什么呢?
函数参数
其实会发生这种情况他的原因就是函数中的参数其实是我们传入的参数的copy
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-
当我们函数结束返回后函数生成的临时变量便被释放了对原来的参数没有任何影响所以才会用到取地址,当我们传入地址的时候,我们对变量进行解引用和就可以进行对参数进行操作,因为地址是唯一的。
解释原来的未解之谜
也就是一开始的运行结果为什么会这样
我们定义的
node *p=NULL;
Initlinkllist(p);
但是我们传入的是p所以我们无法改变p,如果我们要像第一种写法的时候我们就要传入p的地址我们才可以改变p
所以就要传入二级指针
typedef struct node
{
int a;
struct node *next;
}node;
void Initlinklist(node **p)
{
if(*p==NULL)
{
* p=(node*)malloc(sizeof(node));
}
(*p)->a=0;
(*p)->next=NULL;
}
int main()
{
node*p=NULL;
//IninLinklist就是一个链表的初始化函数
Ininlinklist(&p);
if(p==NULL)
{
printf("NULL");
}
else{
printf("good");
}
system("pause");
return 0;
}
运行结果为
good
总结:我们要改变什么就要把他的地址传入函数,无论你是否为指针,要改变谁就应该把谁的地址传入函数