指针与指针变量是两个不同的概念1.指针本身只不过就是一个地址、一个内存块,它里面可以存任意的值,一个指针的值可以是任何内容,可以是一个基本类型的变量的值,也可以是自定义类型的变量的值,当然也可以是一个指针类型的变量的值,它说明这个地址、内存块里存的是什么东西一个指针变量就是一个变量,不过这个变量的值是一个地址不知道理解是否正确请点评,谢谢!2.还有就是一个指针变量有什么用,一般什么时候用,有什么好处?请指教,谢谢!
调试欢乐多
声明p是一个指针变量。p 是一个指针。。
:)
我认为在讨论这个问题的时候要想清楚,是要讨论指针类型在语言中的意义,还是指针类型是如何实现的。
也许"指针是个记录类型"这种说法不妥,我也认为这是属于语言实现的部分,但究竟是怎样实现的,不会是无中生有吧。总而言之,一切都离不开Byte。但我可以肯定指针决不会就是一个整型变量。整形变量只是地址而已,而指针是指向这个地址的一种描述。
请看看编译原理相关的书吧,因为我也不是了解的很清楚,不能给你仔细的解释。但是可以肯定的说你的看法有问题。其实在实现阶段,就是一个整型也不是你想的那么简单,一样也要保存有类型信息的。但是这个和编程时候的数据类型根本不是一个层次的问题。
在很多过程式语言中只能通过指针实现某些数据结构。指针可以在堆中分配空间。而基本数据类型都是在栈中分配的。什么时候用呢?
如果你是用C/C++估计你不会问这个问题了,因为只要编程基本上必然会用到。如果你用delphi,基本上不需要用。用指针变量有什么好处呢?
什么时候用呢?
你的指针和指针变量是什么意思呢?在我看来没有指针变量概念,任何变量都是可以通过指针指向的。
一个类类型的变量(对象)不也是一个指针吗?我看过c的指针变量是说是指针类型的变量,指针变量的引用是指
1.把一个变量的地址赋给一个指针变量
2.把一个变量的值赋给一个指针变量
Type
pInt = ^Integer;
ppInt = ^pInt;
var
i: Integer;
p: pInt;
pp: ppInt;
begin
i := 2;
p := @i;
pp := @p;
end;
比如:
var
i: Integer;
这里i是变量,i在内存里肯定有一个存放的地方(内存地址,指针是也),
只不过编译器给我们做好了而已!!!
指针变量是一个数据 存在于数据断,内容表示一个地址,它本身也有一个内存地址.如果内存理解为房间 地址就是门牌. 程序的代码段理解为管理员, 管理员有时关心房间里住的人(用变量来操作),有时只喜欢根据门牌号(指针)来处理问题,比如:今天晚上512的人全都搬到123去. bonniewater帮我倒杯水,(bonniewater住哪屋了就不管了)
http://expert.csdn.net/Expert/topic/2502/2502986.xml?temp=.8532526
你的回答真能让人笑话你没做过项目!
如Integer就是变量。如果定义了PInteger = ^Integer,那么PInteger就成了指针了。
指针是指针变量的简称。
在32位系统下一个指针占用4个字节,与integer变量恰好相等。
其实根本原因是,因为通用寄存器是32位的。
指针所存的地址是变量的入口,就是开始的那个字节的地址。也是一个相对地址,使用地址操作一个64位的word就一次读出8个字节,其他的一样,所以指针有个类型问题,这个类型是怎么实现的我也没有追究过,应该是编译器控制的。如果使用一个可变长的字符串指针,不断的加,那么就可能出现地址越界,就是超过所划定的地址空间,这就是著名的溢出。 好多地方存在溢出漏洞,C语言最多。溢出如果处理不好,使的其他的程序的地址空间的内容更改,或者系统转而处理一些被刻意安排的指令。 指针的危险性就在这里。 指针可以加减的,根据类型每次前后移动,类型是32位就每次移动4个地址 罗嗦一堆,是不是想听的啊?
i: integer; //占4个字节,存放一整数
p: pointer; //同样占4个字节,存放的也是一个整数
pp: pointer; //看上面……
假设i存放在编号$0001~$0004的内存中,p存放在$0028~$0031的内存中,pp存放在$1000~$1003空间中。执行下面的语句:
i := 123; //i的内容被赋予123
p := @i; //p的内容被赋予i的地址
pp := @pp; //pp的内容被赋予p的地址
那么,$0001~$0004的内存里存放的数据就是123(i的内容),$0028~$0031里的数据就是$0001(p的内容),$1000~$1003的内存中存放的数据就是数字$0028了。看到了,指针是一种类型,它的形式是一个32位的数字,意义为引用的内存单元的编号。指针变量即是存放指针类型(32位数字)的变量,变量本身是需要存储空间的。也可以换种说法:“存放数据的内存块被称做变量,内存块的标号被叫做内存地址,在程序设计中也被称作指针,存放这种内存地址类型的就是指针变量了”,通过内存地址,你可以引用特定编号的内存中的内容
例如:
var
p: pointer;
i: integer;
i := 1024;
p := pointer(i);
或者
integer(p) := 1024;
都是可以的且效果相同,但是天知道1024单元存放的是什么东西
在看下面的:
var
s: string;
p: pointer;
s := 'abcdef';
p := @s[1]; //p里存放的是'a'的内存单元的地址
p := integer(p) + 3;
最后p里存放的是什么?当然是——字符'd'了
1.编译器角度:所有变量都是有类型的,类型由编译器根据语言的规定去对待
2.内存角度:所有的变量都是内存空间例如
var
PI:PInteger;
begin
PI:=Addr(Self.Tag);
end;上面代码从内存角度去理解,PI就是一个内存中的空间,里面存放的内容是另外一个内存空间Self.Tag的内存地址(相对);从编译器角度去理解,PI是一个类型的实例,而Self.Tag也是一个类型的实例;最后把两种看待事物的角度联合起来上面的代码就很清楚了,编译器根据OP语言的规则在看待我们书写的代码的时候会使用类型这个概念去区分不同的代码内容和对这些内容的相关操作(这个地方和类的概念十分相似),但无论如何看待在编译以后程序加载到4G的进程空间的时候都要占据内存地址,这个时候实际上类型概念已经没有多大意义,但我们仍旧可以反过来看待各种空间的不同使用方式,这个方式就是由编译器去具体对待的....其实任何程序说白了都是由指针组成(因为任何代码最后都要进入内存,而对代码的访问就必须知道地址,地址就是指针,所以任何程序都是指针组成:看看TypInfo单元的RTTI定义可以帮助你理解这个东西),而任何程序的执行过程都是指针的跳转过程.....
像:
Type
PNode = ^MNode;
MNode = Record
end;