引用到底是不是指针

元明 2000-03-31 03:56:00
加精
拿以下的程序来说,swap函数定义了两个整形引用,当调用swap函数时,&用于传递参数之前,指示编译程序将参数的地址传递给swap的两个整形引用,那这里的a,b是否与i,j共用了同一块儿内存?
#include <stdio.h>
main()
{
extern void swap(int &a, int &b);
int i = 7, j = -3;
swap(i, j);
printf("The value of i = %d j = %d", i, j);
}

void swap(int &a, int &b)
{
int temp = b;
b = a;
a = temp;
}
...全文
878 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
niwalker 2001-09-10
  • 打赏
  • 举报
回复
我个人认为,引用不同于指针,虽然大多数情况下可以当作指针来看。一个明显的例子就是函数中参数的传递,这个例子可以印证楼上的几位朋友说的:
当函数的参数是指针类型时,把一个指针传递给函数,在函数中修改指诊所指向的内存中的值。但函数返回后,你们认为指针指向的内容是函数执行前的,还是被修改的?
如果函数的参数时引用的话,做同样的处理,结果呢?

各位如果有什么疑问,可以试一试。几年前,我曾经被这个问题害苦了:)
QXLEE 2001-09-09
  • 打赏
  • 举报
回复


具体可以看书
QXLEE 2001-09-09
  • 打赏
  • 举报
回复


有好几个区别。
netdiff 2000-08-04
  • 打赏
  • 举报
回复
References is an alias (an alternate name) for an object.

References are frequently used for pass-by-reference:

void swap(int& i, int& j)
{
int tmp = i;
i = j;
j = tmp;
}

int main()
{
int x, y;
// ...
swap(x,y);
}
Here i and j are aliases for main's x and y respectively. In other words, i is x — not a pointer to x, nor a copy of x, but x itself. Anything you do to i gets done to x, and vice versa.

OK. That's how you should think of references as a programmer. Now, at the risk of confusing you by giving you a different perspective, here's how references are implemented. Underneath it all, a reference i to object x is typically the machine address of the object x. But when the programmer says i++, the compiler generates code that increments x. In particular, the address bits that the compiler uses to find x are not changed. A C programmer will think of this as if you used the C style pass-by-pointer, with the syntactic variant of (1) moving the & from the caller into the callee, and (2) eliminating the *s. In other words, a C programmer will think of i as a macro for (*p), where p is a pointer to x (e.g., the compiler automatically dereferences the underlying pointer; i++ is changed to (*p)++; i = 7 is automatically changed to *p = 7).

Important note: Even though a reference is often implemented using an address in the underlying assembly language, please do not think of a reference as a funny looking pointer to an object. A reference is the object. It is not a pointer to the object, nor a copy of the object. It is the object.

luckybat 2000-07-20
  • 打赏
  • 举报
回复
gun2,象你这样的“批评”,至少说明你根本不懂得研究的乐趣。再者,你可以对"咬文嚼字"不以为然,但对你没用的不等于对别人没用,我承认,总编一些应用软件的话,当然不必考虑这么多。
gun2 2000-05-11
  • 打赏
  • 举报
回复
有一千个读者,就有一千个哈姆雷特。

对于luckybat的咬文嚼字似乎并不利于我们理解和解决问题。就把引用看成是常指针吧,我不觉得有什么不妥的。C++的一大优点在于:她首先是C,然后是C++。

多研究些问题,少谈些“主义”。
wedong2000 2000-04-28
  • 打赏
  • 举报
回复
在C中,所有函数调用都是传值调用,传引用是通过模拟实现的,即传递指向对象的指针并在函数调用时复引用该指针访问这个对象。传递的数组名也是指针,C++通过提供引用参数纠正C的这种不足。INT &count :COUNT 是对一个整数变量的引用。只要传递该变量名,变量会自动以传引用方式调用。
luckybat 2000-04-26
  • 打赏
  • 举报
回复
always:
的确存在引用的强制类型转换.
cybersailor:
这段话与我说的并不矛盾,因为从最前端(机器指令)的角度来讲,任何类型的概念都不存在了,目前的问题既然是关于类型的,还是让我们多从编译时刻谈论吧.
qxp:
你思考的角度令我佩服,但在你的例子中,i的左值是它所在的地址单元,i的右值是它所代表的地址值;j的左值是它所代表的对象,j的右值是它所代表的对象的值.
sunsetyang:
常量指针的参数传递方式仍是传值,并非我所说的“传地址”,以char型为例,有两种形式:
1) char * const p; ----毫无意义,类似于const int i
2) const char * p; ----可限制对p指向的内存单元的修改
这两种方式都是传值
amanne:
谢谢!不过您说的第一条有误,对于指针的传递来讲,并没有做任何特殊的工作,分配内存和函数结束时的释放内存都必须由程序员自己显式地完成;至于我说最好不要以引用作为返回值,原因仅仅是便于错误处理:若函数处理过程中出错,便不能传回一个有效的对象了,这点在BIDS类库体系中很明显,BIDS专门定义了一个静态全局对象作为错误对象供返回,多麻烦!若返回指针,可以NULL作为出错标志。当然,目前比较流行的已经是使用异常类作为出错处理手段了.
wuyunzhou:
正确!




wuyunzhou 2000-04-25
  • 打赏
  • 举报
回复
amanne的第一条好象还是有点问题,指针应用拷贝的是指针值,而不是指向的值的拷贝,试想,当你用指向一个巨大的结构或类的指针作函数参数时,拷贝到形参的肯定是机构的地址,而非结构本身.
另LUCKYBAT说的对,引用,乃一变量之别名,说白了是对它所引用的变量来操作,当然会有安全检查保证你确实引用到了这个变量,而指针,把所要用的变量的地址记下来,函数的形参值是这个地址值的拷贝,...
酷点点 2000-04-24
  • 打赏
  • 举报
回复
可以说luckybat对引用的理解非常的透澈,也讲解的特别的详细!我总结一下三点说明:
1,引用和一般指针(为什麽叫一般指针,我认为它们之间还是有不少共同点)的最大区别是,是否在程序运行过程中进行了值拷贝.(当然这些工作我们不可见,有编译程序具体处理)虽然指针只传递了一个地址给函数,但函数在编译后实际的执行还是把该指针指向的值进行了拷贝(我这样认为,不知对不对),当然也就多了开始时的分配内存和函数结束时的释放内存(因此增加了开销!)而引用就没有进行这项工作.
2,我们常常把那些在函数中不需更改的参数用常量引用来代替.告诉函数不能修改引用参数的值.如:
int sum(const &a,const &b,const &c)
{return a+b+c;}
当然返回时用引用也是很常用的,特别是在对象被修改时,返回一个对象的引用是一个不错的建议.因为函数的返回值不用在调用环境中分配额外的空间来保存.
3,在不用常量引用时,对我们编程人员来说,"好象"是一样的(表象上),但实际的实现上很不一样,当然这个不一样是体现在编译程序的处理上,第一点是很好的说明,不过对编程序员透明.
[注]如有不对的地方,请luckybat批评指正.

sunsetyang 2000-04-24
  • 打赏
  • 举报
回复
常量指针传递的不就是不能篡改的指针?也就是luckybat所说的传地址!传拷贝的方法在具体实现上就少了写保护这一点。应该说在实现上常量指针和引用是相同的。luckybat所言是针对强类型语言而言的。

qxp 2000-04-22
  • 打赏
  • 举报
回复
任何一个变量都有其语义含义,即他的左值和右值.现在我们来比较一下引用和指针的左值和右值有和差别. int * i; int & j;
i 的左值是什么?是分配给指针i的内存单元.i 的右值是里面存放的内容:指针值
j 的左值是所引用对象的地址,右值是所引用对象的值.
很显然,指针和引用是有明显不同的,在概念上或语义上.
当然,在实现上,现有的系统可能会用指针来实现引用.
以上是我的理解,请大家指教
always 2000-04-06
  • 打赏
  • 举报
回复
从引用是变量的一种别名来看,引用是相同(至少兼容)数据类型的变量的地址,没有强制类型转换的引用吧(我没见过)。这相当于一种约束,指针就灵活多了。在同一种类型的参数传递中,两者用起来好象差不多。
Shania 2000-04-06
  • 打赏
  • 举报
回复
a
luckybat 2000-04-06
  • 打赏
  • 举报
回复
可以这么说:引用是经过编译器对象验证的“安全的指针”。
我的一条经验是:引用只能作参数,返回值尽量用指针。

我在上面的帖子中从编译方法的角度作了些阐述,仅仅是因为对此较有兴趣而已,其实经过大家讨论应该都清楚怎么个用法了,这就够了。

cybersailor 2000-04-06
  • 打赏
  • 举报
回复
给大家贴一段E文看看,这是MSDN里面的说法
A reference is a 16-bit or 32-bit quantity that holds the address of an object but behaves syntactically like that object. A reference declaration consists of an (optional) list of specifiers followed by a reference declarator.

In C++, any object whose address can be converted to a given pointer type can also be converted to the analogous reference type. For example, any object whose address can be converted to type char * can also be converted to type char &. No constructors or class conversion functions are called to make a conversion to a reference type.

「已注销」 2000-04-05
  • 打赏
  • 举报
回复
引用是指针.不信的话可以在VC汇编窗口下调是,看看他们的指令有和不同.
元明 2000-04-05
  • 打赏
  • 举报
回复
分数是低了点,但我总有很多问题要问,因此有些保留,大家不介意吧!
元明 2000-04-05
  • 打赏
  • 举报
回复
应该是 i的引用 == i所指向的变量.
元明 2000-04-05
  • 打赏
  • 举报
回复
gun2高手你在吗?希望你加入进来.
加载更多回复(11)

69,364

社区成员

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

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