关于引用和指针

yao1215 2004-11-22 01:22:31

下面是两个文件,一个用引用另一个用指针
//1.cpp
#include<iostream>

using namespace std;

void increment(int*& i){i++;}

int main(){
int* i=0;
cout<<"i="<<i<<endl;
increment(i);
cout<<"i="<<i<<endl;
}

//2.cpp
#include<iostream>

using namespace std;

void increment(int** i){i++;}

int main(){
int* i=0;
cout<<"i="<<i<<endl;
increment(&i);
cout<<"i="<<i<<endl;
}
用引用的结果是正确的,输出是
i=00000000
i=00000004
但用指针那个无法得到预期的结果,输出为:
i=00000000
i=00000000

请问这是为什么?
...全文
110 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
geland 2004-11-22
  • 打赏
  • 举报
回复
结果完全正常,你自己好好理解一下,看看基本概念
pomelowu 2004-11-22
  • 打赏
  • 举报
回复
汗~~~说错了~~~
void increment(int** i){i++;}
这个函数中的i是指向main中i的指针,i++之后i就不再指向main中的i了,同时,main中的i也并没有改变。


void increment(int** i){(*i)++;}
同样,这个函数中的i也是指向main中i的指针,但是(*i)++让main中的i做++运算,故而能达到你预期的目的。
快乐鹦鹉 2004-11-22
  • 打赏
  • 举报
回复
简单的说,可以看这样:
increment(int& i);和increment(int *i);函数内容都是i++
这里,第一个i实际上是一个整数,而第二个i实际上是一个指针!两者是不同的,因此函数内容i++表达的也是不同的意思。第一个表示i的内容增加1,而第二个代表i的地址增加1
同理,你所给的int*& i和int** i,也是完全不同的意思。只是比上面的例子更多加了一层指针而已。
lamputa_lito 2004-11-22
  • 打赏
  • 举报
回复
老问题。传值和引用的区别。
pomelowu 2004-11-22
  • 打赏
  • 举报
回复
指针也是一个变量,
void increment(int** i){i++;}
函数改变的是main中2重指针i的副本的值,而不是你预期的改变i的值。
正确的写法是:

void increment(int** i){(*i)++;}
pomelowu 2004-11-22
  • 打赏
  • 举报
回复
传值和传址你没弄清楚。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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