c语言的传值与传指针的问题
这个是一个精简的程序,主要问题在main函数中#include<stdio.h>#include<stdlib.h>structCountry{charcounnum[5...
这个是一个精简的程序,主要问题在main函数中
#include<stdio.h>
#include<stdlib.h>
struct Country
{
char counnum[5];
char counname[21];
int population;
int family;//depositor存款人
float relief;//救济金
Country *next;
};
typedef struct Country *Lcountry;
//生成数据
int CreateData(Lcountry *head)
{
Country* s,*p;
int i,num;
printf("输入个数:");
scanf("%d",&num);
if(num<1)
{
printf("个数不合法\n");
return 0;
}
//录入数据
for(i=1;i<=num;i++)
{
if((s=(Country*)malloc(sizeof(struct Country)))==NULL)
{
printf("内存申请出错\n");
return 0;
}
printf("输入counnum counname population family relief,中间用空格隔开\n");
if(scanf("%s%s%d%d%f",s->counnum,s->counname,&s->population,&s->family,&s->relief)!=5)
{
printf("录入数据有误\n");
return 0;
}
s->next=NULL;
if(i==1)
{
*head=p=s;
}
else
{
p->next=s;
p=s;
}
}
return 1;
}
//显示数据
void Print(Country* p)
{
printf("counnum \t counname \t population \t family \t relief\n");
while(p!=NULL)
{
printf("%s\t\t%s\t\t%d\t\t%d\t\t%0.1f\n",p->counnum,p->counname,p->population,p->family,p->relief);
p=p->next;
}
}
int main()
{
Country* head=NULL;
//生成数据
CreateData(&head);//这个为什么传的head的值,不过我printf之后显示还是一个地址
//显示数据
Print(head);//这个为什么又传的地址
system("pause");
}
main函数中的两个函数为什么要这么传?
有个问题就是为什么需要双重的指针 展开
#include<stdio.h>
#include<stdlib.h>
struct Country
{
char counnum[5];
char counname[21];
int population;
int family;//depositor存款人
float relief;//救济金
Country *next;
};
typedef struct Country *Lcountry;
//生成数据
int CreateData(Lcountry *head)
{
Country* s,*p;
int i,num;
printf("输入个数:");
scanf("%d",&num);
if(num<1)
{
printf("个数不合法\n");
return 0;
}
//录入数据
for(i=1;i<=num;i++)
{
if((s=(Country*)malloc(sizeof(struct Country)))==NULL)
{
printf("内存申请出错\n");
return 0;
}
printf("输入counnum counname population family relief,中间用空格隔开\n");
if(scanf("%s%s%d%d%f",s->counnum,s->counname,&s->population,&s->family,&s->relief)!=5)
{
printf("录入数据有误\n");
return 0;
}
s->next=NULL;
if(i==1)
{
*head=p=s;
}
else
{
p->next=s;
p=s;
}
}
return 1;
}
//显示数据
void Print(Country* p)
{
printf("counnum \t counname \t population \t family \t relief\n");
while(p!=NULL)
{
printf("%s\t\t%s\t\t%d\t\t%d\t\t%0.1f\n",p->counnum,p->counname,p->population,p->family,p->relief);
p=p->next;
}
}
int main()
{
Country* head=NULL;
//生成数据
CreateData(&head);//这个为什么传的head的值,不过我printf之后显示还是一个地址
//显示数据
Print(head);//这个为什么又传的地址
system("pause");
}
main函数中的两个函数为什么要这么传?
有个问题就是为什么需要双重的指针 展开
展开全部
其实简单来说, 如果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"的地址.
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"的地址.
追问
如果不想使用双重指针可以吗》?
比如直接返回head,可以做到吗
追答
我不太清楚你的问题, 你是指CreateData()可不可以不使用双重指针的形参是吗?
其实你只要理解函数本身的功能, 也就能明白了, head 本身表示的是一个"Country"队列的头, 它本身指向队列的第一个数据, 只能是一个地址. 而形参使用双重指针的原因, 是为了能在CreateData()里面修改head的值(你在main()定义的变量), 你只有把head的地址传进函数CreateData()里面才能达到修改head值(main()定义的变量)的目的. 又因为head本身是一指针变量, 所以取其地址当然就成了双重指针了.
当然, CreateData()的原型也可以写成:
Lcountry CreateData();
这样调用时就可以写成: head = CreateData(); 其中CreateData()返回新创建的队列的第一个节点的指针, 就可以了.
展开全部
c语言中指针即地址,地址的传值可以引起参数的变化。
比如:
&x, &y是取这两个变量的地址,作用空间在main函数里。然后函数调用把这两个变量的地址传递到函数myadd中,在函数中的*a和*b分别是引用地址指向的变量值,等于是取到了x,y本身的值。在myadd中直接操作*a可以改变x的值。
通俗来说因为&x,&y表示的是x,y的地址。所以传递的是地址。意思就是说,函数可以通过地址引用变量。
比如:
&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<stdio.h>
void get(char **p)//双重指针
{
char *str = "hello";
*p = str;
};
int main()
{
char *p;
get(&p);//双重指针
printf("%s\n", p);
return 0;
}
/********下面的是错误的**********/
#include<stdio.h>
void get(char *p)//单指针
{
char *str = "hello";
p = str;
};
int main()
{
char *p;
get(p);//单指针
printf("%s\n", p);
return 0;
}
希望能帮到你
//这样使用正确
#include<stdio.h>
void get(char **p)//双重指针
{
char *str = "hello";
*p = str;
};
int main()
{
char *p;
get(&p);//双重指针
printf("%s\n", p);
return 0;
}
/********下面的是错误的**********/
#include<stdio.h>
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的原理就是建立一些数据实体(并且连城链表),然后将第一个数据实体的指针传出来。因为你要传的是指针,当然只能是指针的指针来作形参构成引用传递了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
CreateData(Lcountry *head) //如果只是传指针,那是形参,不会修改指针所指向的内容,传指针的地址,就可以修改指针指向的内容
Print(head);//这里传形参就可以,不涉及到修改指针,只是打印指针指向的内容
Print(head);//这里传形参就可以,不涉及到修改指针,只是打印指针指向的内容
追问
如果不想使用双重指针可以吗》?
比如直接返回head,可以做到吗
追答
直接返回head 也是可以的 不使用双重指针好像不行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询