其实简单来说, 如果CreateData()和Print()这二个函数是正确的, 你只要分别看一下CreateData()和Print()的函数原型:
1. int CreateData(Lcountry *head): 它的输入参数类型是 Lcountry *, 也就是Country **, 而 "head"是Country *型, 所以传给CreateData时, 应该取 &head, 也即为 Country **型.
2. void Print(Country* p): 它的输入参数类型就是Country *, 而 "head"正是Country *型, 所以只要给它传 "head"就可以.
3. "head"和"&head"都是指针, 都是地址, "head"是"*head"的地址, 而"&head"是"head"的地址.
c语言中指针即地址,地址的传值可以引起参数的变化。
比如:
&x, &y是取这两个变量的地址,作用空间在main函数里。然后函数调用把这两个变量的地址传递到函数myadd中,在函数中的*a和*b分别是引用地址指向的变量值,等于是取到了x,y本身的值。在myadd中直接操作*a可以改变x的值。
通俗来说因为&x,&y表示的是x,y的地址。所以传递的是地址。意思就是说,函数可以通过地址引用变量。
CreateData(&head)之所以需要双重的指针,是因为这个函数是将参数作为输出,而内存分配本来就是需要一个指针的,而且它是在函数体内分配的。如:s=(Country*)malloc(sizeof(struct Country)),如果想作为输出的话,所以存入参数时必须取它的地址(也就是传入指向s的指针,这就成了双重指针了)。如果你直接返回head的话,你就不能引用在函数体内的内存了,由于CreateData函数是在函数体内分配内存的,也即是是栈内存,函数执行完就会被释放了,如果直接传入head而不是&head,并返回head就会引用无效内存。举个例子:
//这样使用正确
#include
void get(char **p)//双重指针
{
char *str = "hello";
*p = str;
};
int main()
{
char *p;
get(&p);//双重指针
printf("%s\n", p);
return 0;
}
/********下面的是错误的**********/
#include
void get(char *p)//单指针
{
char *str = "hello";
p = str;
};
int main()
{
char *p;
get(p);//单指针
printf("%s\n", p);
return 0;
}
希望能帮到你
CreateData(&head) 这里传的是双重指针,刚好和形参是匹配的。形式参数必需用双重指针的原因是外层指针是值传递的是不可以修改的,现在要修改内层指针当然只能传双重指针了。
你这个 CreateData的原理就是建立一些数据实体(并且连城链表),然后将第一个数据实体的指针传出来。因为你要传的是指针,当然只能是指针的指针来作形参构成引用传递了
CreateData(Lcountry *head) //如果只是传指针,那是形参,不会修改指针所指向的内容,传指针的地址,就可以修改指针指向的内容
Print(head);//这里传形参就可以,不涉及到修改指针,只是打印指针指向的内容