c++ 值传递

fun(int*x){//在函数体中改变x就是改变实参的指向而改变*x就是改变实参指向的值}fun(int&x){//在函数体重改变x就是改变实参的值...请问如何改变实... fun(int *x){//在函数体中改变x就是改变实参的指向 而改变*x就是改变实参指向的值}
fun(int &x){//在函数体重改变x就是改变实参的值...请问如何改变实参指向呢??}
展开
 我来答
百度网友dd93720
2012-04-04 · TA获得超过1205个赞
知道小有建树答主
回答量:195
采纳率:0%
帮助的人:228万
展开全部
在C++中,所谓的指针做形参也好,变量做形参也好,传递的都是内容;也就是说是单向传递,传递的是个数值;而我们可以理解引用传递的才是真正的地址;这里你的首行是函数中参数的传递,不过用的参数是指针而已,传递的其实还是值;后面一行是引用,也就是真正意义上的地址传递了;下面举个简单的小例子详细的说明一下:
首先来说第一行。比如,现在我们给fun(int * x)实参传递个指针变量b,(假设变量b指向了地址2000),当你在fun函数中使用x时利用x++,按你上面的说明,如果“在函数体中改变x就是改变实参的指向”的话,函数返回后,b的内容应该变为2004了,但是实际上并不是这样的,b的内容仍然是2000,也就是说指针形参传递的仍然是值是单向的传递,是不会改变对应的实参的内容的;可以自己输出一下b和a的内容实际看一下是不是!!
至于,改变*x的就是改变实参指向的值,说的不是很准确;应该说改变*x就是改变了x指向的地址中的值的内容;例如,实参b指向地址2000,而内存地址2000中的内容是100,如果在函fun中用(*x)++,表示2000地址中的内容++,也就是100变为101了,因为改变了内存中2000地址中的内容,所以当在调用函数结束后,访问内存2000时,其中的内容已经是101了;

对于第二行:形参使用int &x表示引用,也即对将要传入的实参重新起了一个名字,别称为x,这是与上面的区别是:函数中的X并不会分配内存(上面的行调用函数时会给x分配内存,当函数调用完毕返回时内存释放),而是将传入的实参的内存地址给对应的函数,也即对x的任何操作都是在操作实参,比如传入的实参的为b(int b,这里传入的b 为int型当然要是更改函数的话也可以传入指针类型的b)实际上,x和b相当于是一个变量,只是有两个名字而已;当你修改了函数,利用的为指针的引用时,在函数中改变形参的指向,实际就是改变实参的指向了;

想说的详细点,不免就啰嗦了,希望对你有帮助!!
追问
我完全听懂你说的了 非常感谢你耐心详细的回答
但我还有有个疑问
下面是链栈进栈的算法
void push(LinkStack *s ,int x){//将x压入栈顶
LinkStack *p = new LinkStack ;
p->data = x ;
p->next = s ;
s = p ;
}
按照上面的说法 这个算法应该是错的 因为传入的是链栈的指针 是单向传递 也就是说最后一句s = p并没能改变实参链栈的结构 是这样吗? 如果是 在c语言环境下 该如何改变这个算法? 非常感谢你
追答
我想你应该实验过了,正如以上的解释在子函数push中改变变量的值返回后实际上实参的值是没有发生变化的,也就是说你理解的最后一句没有改变实参栈顶指针地址是正确的,达不到入栈的目的,函数失效。

办法建议如下:
1.因为这里只是需要告诉主函数中改变后的栈顶指针指向即可,在C语言环境下,可以简单的通过函数的返回值来实现,也就是说将push的返回值类型void改为LinkStack *类型,然后在主函数中将push的返回值(指针)赋值给原来的栈顶指针(即s = fun(s,x)),这样就可以实现内容传递了;
2.当然也可以用指向指针的指针来做函数形参,这样间接改变栈顶指针内容(不过既然简单返回值就可以,感觉就不用这么麻烦为好);
这里提示一下,纯C中是使用malloc()来动态的分配内存地址的,然后用free()来释放,你的函数中使用的new用于C++环境中;
为了说明问题,这里举一个简单的例子吧:
#include
#include
struct LinkNode{
int num;
struct LinkNode * next;
};

struct LinkNode * push(struct LinkNode *s, int x){//将x压入栈顶
struct LinkNode *p = (struct LinkNode*)malloc(sizeof(struct LinkNode));
p->num = x;
p->next = s;
return p;
}

void main()
{
struct LinkNode myNode;
struct LinkNode * pTmpNode = NULL;
int i = 0;
myNode.num = 1;
myNode.next = NULL;
pTmpNode = &myNode;
pTmpNode = push(pTmpNode, 2);

for(; pTmpNode != NULL; pTmpNode = pTmpNode->next){
printf("%5d\n",pTmpNode->num);
}
}
输出结果:2 1 说明已经成功入栈了;
这样应该就可以帮你解决问题了,呵呵,加油!
百度网友46d9a94
2012-04-03 · 超过17用户采纳过TA的回答
知道答主
回答量:98
采纳率:0%
帮助的人:46.2万
展开全部
fun(int& x) 其实这个问题我是这样理解的,何谓引用,前面有定义,后面才有引用!
比如:int a=10; fun(a);这样就实现了这个函数的调用了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
超凡还安逸灬小牛L
2012-04-03 · TA获得超过120个赞
知道小有建树答主
回答量:252
采纳率:0%
帮助的人:195万
展开全部
第一个传入的是一个int型的指针
第二个传入的是一个int型的变量
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小何才露尖尖角儿
2012-04-03 · TA获得超过362个赞
知道小有建树答主
回答量:344
采纳率:0%
帮助的人:387万
展开全部
fun(int *x){//在函数体中改变x就是改变实参的指向 而改变*x就是改变实参指向的值}
上面这句话是错的。在函数体中改变X是不会影响实参的,X只是实参的一个拷贝,改变X不会改变实参的值。

fun(int &x){//在函数体内改变x就是改变实参的值...请问如何改变实参指向呢??}
上面这句话也是错的。这个形参是一个实参的引用,也就是说实参和形参是一样的,是同一个对象,在函数体里改变X就是改变实参。而实参的指向是不存在的。因为它就是一个整形。&X在形参里不是表示X的地址,而是表示X是实参的一个引用。也就是表示实参和形参是一个对象。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qmt1211
2012-04-03 · 超过30用户采纳过TA的回答
知道答主
回答量:112
采纳率:0%
帮助的人:96万
展开全部
fun(int &x) //这个是引用啊。何来指向?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式