指针(Pointer)和引用(Reference)的区别!!!!

FrameSniper 2003-06-17 03:17:33
学了半天Delphi,老是看到指针和引用这两个概念,但有什么区别(我没有感觉有什么区别,但还老是认为有区别!)不清楚,不知道创造Delphi的工程师为什么要创造引用这个概念!?

大家来说说自己的看法,还说不定哪位仁兄能说出令大家满意的区别啊!呵呵....
...全文
290 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
lance 2003-08-27
  • 打赏
  • 举报
回复
败托各未星级人物不要误倒大家了。

第一,引用不是从C++中引入的,在pascal时代就有引用了。pascal是个c同时代的产物。

第二,引用可以是nil,当我们释放一个对象时,难道不是这样吗?
SomeObject.Free
SomeObject:=nil;
和c++是有区别的。

那到底引用和指针有什么区别呢?几乎没有什么区别,要说区别,只是语法不同罢了,
语议上来说是一个东西。

指针是什么?变量。 变量是什么?内存中的一段存储空间。多大?四个字节。
存储的是什么?一个地址。

引用是什么?变量。 变量是什么?内存中的一段存储空间。多大?四个字节。
存储的是什么?一个地址。

你说有什么区别?

如果,我问指针和一个整形变量有什么区别?
在汇编语言看来没有区别。






yoisyois 2003-06-19
  • 打赏
  • 举报
回复
受益匪浅。

很欣赏duxin(独心)的比方。

^_^
FrameSniper 2003-06-19
  • 打赏
  • 举报
回复
go on....
gzyzljk 2003-06-18
  • 打赏
  • 举报
回复
为什么:SizeOf不适合于对象,返回的总是4?
想一想也就明白点了
FrameSniper 2003-06-18
  • 打赏
  • 举报
回复
go on........
fancier 2003-06-18
  • 打赏
  • 举报
回复
//觉得 引用是一个有效指针的实例 ;
s1,s2 : String ;

s1 := '1234' ;
s2 := s1 ; // s2 并没有分配空间只是引用 s1,此时 s1 引用计数加 1
// 个人认为这里是Delphi实现字符串变量互相赋值的一种机制,这里的“引用”与“指针和引用”的意义不同,因为s2还可以赋值
s2 := ‘1111’ ; // s2 被指向重新分配存储‘1111’的空间,此时 s1 引用计数减 1

//如果OP与C++中引用的意义一样的话,s2初始化后,它所指向的地址空间不能改变,能改变的是空间里面存储的值.
fancier 2003-06-18
  • 打赏
  • 举报
回复
wjlsmail(计算机质子)
//觉得 引用是一个有效指针的实例 ;
如字符串 :
s1,s2 : String ;

s1 := '1234' ;
s2 := s1 ; // s2 并没有分配空间只是引用 s1,此时 s1 引用计数加 1
// 我个人认为这里应该是Delphi实现字符串变量具有赋值的一种机制
// s2还可以重新赋值, 如下
s2:= '111111'; //这时候 s2 会被分配空间存储'111111',此时 s1 引用计数减 1
// 所以这里的"引用"的意义是否与语言上"指针和引用"不一样?
citytramper 2003-06-18
  • 打赏
  • 举报
回复
C++
Example(int& i, int* j);
{
i:= i+1;
@j:= @j+1;
}
Delphi:
里面怎么写?
-------------------------------------
是不是应该这样
procedure Example(var i:integer;var j:^integer);
begin
//.........

end;
wjlsmail 2003-06-18
  • 打赏
  • 举报
回复
//觉得 引用是一个有效指针的实例 ;

如字符串 :

s1,s2 : String ;

s1 := '1234' ;
s2 := s1 ; // s2 并没有分配空间只是引用 s1,此时 s1 引用计数加 1

// 望指正
fancier 2003-06-18
  • 打赏
  • 举报
回复
Eastunfail(恶鱼杀手): 对于简单的数据类型,
C++
Example(int& i, int* j);
{
i:= i+1;
@j:= @j+1;
}
Delphi:
里面怎么写?
Eastunfail 2003-06-18
  • 打赏
  • 举报
回复
Thinking in C++(英文影印版)中这么说的:

451页
A reference(&) is like a constant pointer that is automatically dereferenced. It is usually used for function argument lists and functions return values. But you can also make a free-standing reference. For example
..................

..................
There are certain rules when using references:
1. A reference must be initialized when it is created.(Pointers can be initialized at any time).
2. Once a reference is initialized to an object, it cannot be changed to refer to another object.(Pointers can be pointed to another object at any time)
3. You cannot have NULL reference. You must always be able to assume that a reference is connected to a legitimate piece of storage.


Reference in functions

The most connon place you'll see references is as function arguments and return values. When a reference is used as a function argument, any modificaiton to the reference inside the function will cause changes to the argument outside the function. Of cource, you could do the same thing by passing a pointer, but a Reference has much cleaner syntax(You can think of a reference as nothing more than a syntax convenience, if you want.)
..............
太多了,就打这么多
zzyx 2003-06-18
  • 打赏
  • 举报
回复
猩猩园地?
听课了
Eastunfail 2003-06-18
  • 打赏
  • 举报
回复
fancier(OP&&C/C++) :

嘿嘿~~~Delphi的string和C++的String可不是一样的哦~~~~~~

var
s1,s2 : String ;
s1 := '1234' ;
s2 := s1 ;
的时候,s1并没有增加引用计数。s2的值实际上是在内存中重新分配的。而不是引用

var s1,s2:string;
begin
s1:='abcdef';
s2:=s1;
ShowMessage(Format('s1'' pointer is %p'#13#10's2''pointer is %p',[@s1[1],@s2[1]]));

s1和s2的地址明显不一样

蓝色光芒 2003-06-18
  • 打赏
  • 举报
回复
//保存指针
Function FormatObjectVar(Obj : TObject):String;
var
P : pointer;
begin
P := Pointer(OBJ);
Result := Format('%p', [p]);
end;

然后直接保存字符串.
//根据地址引用那个对象
Function GetObj(ObjAddr : String):Tobject;
var
Tmp : TObject;
P : Dword;
S : String;
begin
Result := Nil;
S := Trim(ObjAddr);
try
P := strtoint('$'+S);
TMP := TObject(P);
S := Tmp.ClassName;
Result := Tmp;
except
end;
end;
Eastunfail 2003-06-18
  • 打赏
  • 举报
回复
To fancier(OP&&C/C++)

Example(int& i, int* j);
{
i:= i+1;//HOHO~~~这是C++的语法么?
@j:= @j+1;
}

Delphi:
procedure Example(var i:integer;j:^Integer);
begin
i:=i+1;
j^:=j^+1;
end;
duxin 2003-06-18
  • 打赏
  • 举报
回复
对c++也有些了解 看到 fancier(OP&&C/C++) 的解释我个人完全同意
个人观点:大比方说(直观一点)
赋地址
指针----人(现在还不知道是谁,空地址)------》去干活(指向目的变量或对象



直接叫小明
引用----人(姑且叫小明 以定是谁 不能再变动 form:Tform)--------------》去干活


引 fancier(OP&&C/C++)的发言


引用在作为函数参数传递时,具有指针的效果,但是却可以象传值的一样使用,方式比指针简单。当作为在参数时,通过指针和引用,都可以在函数体内操作直接改变他们所指向的地址空间里面存储的内容,无须编译器为他们创建一个临时变量复制并保存他们的值的一个副本。不同的是,指针所向的地址空间可以改变,而引用是地址的一个别名,引用与所引用地址的关系一经确定,就不能改变;指针的值可以为 NULL ,而引用不能为 NULL,所以凡是其值有可能为NULL的变量不能使用引用。



请指正

wjlsmail 2003-06-18
  • 打赏
  • 举报
回复
// 我是这样想的,不对的地方望大家批评指正

觉得引用是种手段,不像指针一样是一种数据结构 ;编译器通过 引用 使指针共享内存 ; 字符串中的引用也一样 ;

s2 开始并没有自己的空间,通过引用共享 s1 指向的空间,后来才开辟数据域 ;

------------------------

//如果OP与C++中引用的意义一样的话,s2初始化后,它所指向的地址空间不能改变,能改变的是空间里面存储的值.

s1 := '1234' ;
s2 := s1 ; // s2 并没有分配空间只是引用 s1,此时 s1 引用计数加 1
// 个人认为这里是Delphi实现字符串变量互相赋值的一种机制,这里的“引用”与“指针和引用”的意义不同,因为s2还可以赋值

s2 := ‘1111’ ; // 这时候 s2 才被分配空间的,前面的可以看作用引用的手段将 s1 的指针初始化 ,到这儿完成了 s2 的完整初始化(因为任何变量都是指针或者可以看作指针,就都有一个指针和其指向空间的分配) ;
s2 := s1 ; // s2 并没有分配空间只是引用 s1,此时 s1 引用计数加 1 ; // 这里 s1,s2指向同一地址空间

//拿这段代码测试了 :

var
s1,s2 : String ;

s1 := '1234' ;
s2 := s1 ;
ShowMessage(IntToStr(Integer(s1)) + #13#10 + IntToStr(Integer(s2)) ) ;
ShowMessage(IntToStr(Integer(Addr(s1))) + #13#10 + IntToStr(Integer(Addr(s2))) ) ;
s2 := 'ssss' ;
ShowMessage(IntToStr(Integer(s1)) + #13#10 + IntToStr(Integer(s2)) ) ;
ShowMessage(IntToStr(Integer(Addr(s1))) + #13#10 + IntToStr(Integer(Addr(s2))) ) ;

FrameSniper 2003-06-17
  • 打赏
  • 举报
回复
go on....
microjuz 2003-06-17
  • 打赏
  • 举报
回复
靠...听课
Eastunfail 2003-06-17
  • 打赏
  • 举报
回复
哇~~这个帖子壮观的说~~~


我的理解:

procedure foo(var i:integer)
当你使用这个foo的时候,传递的是参数的指针,而不是一个内存中的copy。这样当你在foo中修改i的值的时候,实际上是修改了调用foo的参数的值。
引用的出现,是从C++中引入的,目的最初是为了避免代码的混乱,增强易读性和减少错误发生的可能。引用封装了指针,使得调用foo的用户无需考虑指针的问题。如果你不使用引用的话,也可一直接传指针。例如:
procedure foo(i:^integer);

Too FrameSniper
“引用就是保证了指针所指的对象有效的一个指针”是什么意思,如何保证的?

Fancier说的很清楚了,你无法将一个nil传给一个引用。所以传递给引用参数,可以保证该参数所指向的是一个明确的对象、值。而如果使用指针,则可以传递nil。
加载更多回复(19)

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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