这次主要说明指针传值的问题
在函数中的指针需要传的地址
比如在以下这个单链表建立的代码中;
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}slnode;
/**/
void initiate(slnode **h)//创建空结点,单链表初始化;
{
*h=(slnode*)malloc(sizeof(slnode));
(*h)->next=NULL;
}
slnode append(slnode *p,int x)
{
slnode *s;
s=(slnode*)malloc(sizeof(slnode));
s->data=x;
s->next=p->next;
p->next=s;
}
main()
{
int i,x;
slnode *p;
//p=(slnode*)malloc(sizeof(slnode));
initiate(&p);
//p=(slnode*)malloc(sizeof(slnode));
//p->next=NULL;
for(i=1;i<4;i++)
{
printf("ch%d=",i);
x=getchar();
getchar();
append(p,x);
printf("point ch%d=%c\n",i,x);
}
}
上面这个代码能够运行正常的运行
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}slnode;
/**/
void initiate(slnode *h)
{
h=(slnode*)malloc(sizeof(slnode));
h->next=NULL;
}
slnode append(slnode *p,int x)
{
slnode *s;
s=(slnode*)malloc(sizeof(slnode));
s->data=x;
s->next=p->next;
p->next=s;
}
main()
{
int i,x;
slnode *p;
//p=(slnode*)malloc(sizeof(slnode));
initiate(p);
//p=(slnode*)malloc(sizeof(slnode));
//p->next=NULL;
for(i=1;i<4;i++)
{
printf("ch%d=",i);
x=getchar();
getchar();
append(p,x);
printf("point ch%d=%c\n",i,x);
}
}
而这个代码则不能正常运行
以上两个代码的区别就在于
void initiate(slnode **h)//创建空结点,单链表初始化;
{
*h=(slnode*)malloc(sizeof(slnode));
(*h)->next=NULL;
}
问题在于函数中的指针传值,需要传的是地址。
并且在malloc()函数中,需要分配的也是地址。
那么这样一来就需要两个地址,所以很正常就需要使用(slnode **h)了