C语言函数传递参数时&符号问题

横云断岭
博客专家认证
2008-10-19 03:39:15
下面是链表的初始化的函数,可是不明白createlist_L函数中传递参数有个&符号。
请问这个&在这里是什么意思?
createlist_L函数传递进去的是什么?
为什么有的链表的函数传递时要&这个符号,而有的不用?
//链表初始化
#include <stdio.h>
#include <stdlib.h>
typedef int status;
typedef status elemtype;

typedef struct Lnode
{
elemtype date;
struct Lnode *next;
}Lnode , *linklist;
linklist L;

void createlist_L(linklist &L, int n)
{
linklist p;
L=(linklist)malloc(sizeof(Lnode));
L->next=NULL;
for (int i=n;i>0;--i)
{
p=(linklist)malloc(sizeof(Lnode));
printf("请输入链表的第%d个数!\n",i);
scanf("%d",&p->date);
p->next = L->next;
L->next = p;
}
}
...全文
2439 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shao880527lin 2012-05-07
  • 打赏
  • 举报
回复
这应该是一个c语言程序吧,用的malloc,又没用new
我看你有戏 2008-11-07
  • 打赏
  • 举报
回复
rutherford0614 2008-10-23
  • 打赏
  • 举报
回复
void createlist_L(linklist &L, int n) 等同于 void createlist_L(linklist L, int n) 加个 &表示引用,是C++的用法.

它的好处在于:函数调用时,参数传递过程是把实参的引用传给形参;如果不加&,则传递的是实参的一个拷贝.效率会有所下降.

rutherford0614 2008-10-23
  • 打赏
  • 举报
回复
void createlist_L(linklist &L, int n) 等同于 void createlist_L(linklist L, int n) 加个 &表示引用,是C++的用法.

它的好处在于:函数调用时,参数传递过程是把实参的引用传给形参;如果不加&,则传递的是实参的一个拷贝.效率会有所下降.

wenjunsu 2008-10-22
  • 打赏
  • 举报
回复
&的意思是获取linklist的首地址


chihz3800 2008-10-22
  • 打赏
  • 举报
回复
好好看书!这是引用传递!传递的是参数地址,实参发生改变
我看你有戏 2008-10-22
  • 打赏
  • 举报
回复


指针引用

test4ever 2008-10-22
  • 打赏
  • 举报
回复
void createlist_L(linklist &L, int n)

你要在内部修改这个变量,就用引用,如果不添加引用,这个变量在传入函数的时候会隐式构造临时结构
为了提高效率的时候也可以传入引用
devil_zuiai 2008-10-20
  • 打赏
  • 举报
回复
在void createlist_L(linklist &L, int n)
函数中,因为你对L进行了改变,而且希望这个改变
能在函数返回后仍然存在,所以要用引用。


举例如下

void setA(int* &a)
{
a = new int;//申请内存后a的地址改变了,假如改变后的地址为0x00345b
*a = 3;//0x00345b这块区域上的值改变为3
return;
}
int main(void)
{
int * a = NULL;
setA(a);//传入时a的地址为0x000000
//如果不使用引用传递,那么setA函数返回后a的地址还是0x000000
//那么printf中的*a就出错了,如果用引用传值的话,a的地址就变成了
//0x00345b,和setA函数中的一样,那么printf中的*a就是3,不会出错
//于链表也是同样的道理。
printf("%d", *a);
return 0;
}
chenzhp 2008-10-20
  • 打赏
  • 举报
回复
这应该是C++的语法吧。引用,通过这种方法可以函数参数传递将链表头结点L的值修改。

void createlist_L(linklist &L, int n)
{
linklist p;
L=(linklist)malloc(sizeof(Lnode)); //因为L在函数内部已经被修改,所以传递引用才能在函数结束后传递进去
//的实参才能被实际改变



如果是C语言只有传递指针

void createlist_L(linklist *L, int n)
{
linklist p;
(*L)=(linklist)malloc(sizeof(Lnode));
(*L)->next=NULL;
for (int i=n;i>0;--i)
{
p=(linklist)malloc(sizeof(Lnode));
printf("请输入链表的第%d个数!\n",i);
scanf("%d",&p->date);
p->next = (*L)->next;
L(*L)->next = p;
}
}
HelloDan 2008-10-20
  • 打赏
  • 举报
回复
要确保你写的是C++程序,看一下C++的引用方面的东西。
agurick 2008-10-19
  • 打赏
  • 举报
回复
这是 c++ 的引用
xait_tu 2008-10-19
  • 打赏
  • 举报
回复
在函数()里,相当于声明参数,外加调用参数-----linklist型 参数
也就是 头 节点 地址
机智的呆呆 2008-10-19
  • 打赏
  • 举报
回复
createlist_L(linklist &L, int n) //一般是为链表分配空间时用& ,通过对指针变量的引用,修改函数传入的指针变量的值
分配完空间,对分配的空间里的数据操作时就不加&,引用c++支持 而c是不支持的
chlaws 2008-10-19
  • 打赏
  • 举报
回复
引用.
int b=3;
int &a=b;//取别名一样,其实就是自身

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧