新人散分,基础有关问题。
新人散分,基础问题。。。
是关于Pchar的,书上说Pchar是指针。
那么指针不是保存一个内存地址吗?下面有几个问题,请大神指点啊:
------解决思路----------------------
1、编译器会处理,取出"哈哈哈“字符串的内存地址赋值给指针变量。
2、指针变量在32位下都是4字节的,就是普通的赋值,就像x:=1;y:=x;一样。此时p^的值是"哈哈哈"所在地址上的第一个字节,ps:1个汉字2个字节。
3、p1:=@p, p1指向的是p变量的内存地址,此时p1^等于p的值,也就是"哈哈哈"的内存地址。同样p1^^等于p^,值同上面解释。
------解决思路----------------------
PChar 就是指向一个以Null 结尾的每个字符为一个字节的字符串的指针。 (可以看成是一个字符串)关键是它是每个字符为一个字节,这是windows一些函数参数必有的。
String是字符数组,以字符#0结尾。
在实际使用中,作为Text文本字符,PChar与String效果一致。所以:
1、Pchar类型,可以直接赋值字符;
2、p1:=p; P1得到p的值,此时p1等同于p,指向一个以Null 结尾的指针,由于它又是一个指针,所以必须Pchar(p1)强制返回Pchar类型;
3、p1:=@p; 两边都是地址,可以赋值,这是标准合法语句。p1就是纯内存地址, 只能使用pchar(p1^))返回Pchar类型。
------解决思路----------------------
补充:
Char是一个字节的字符;
PChar是指向以Null 结尾的由Char字符构成的字符串的指针。
这样,就好理解。
------解决思路----------------------
delphi的个别语法有点 为了方便而省略,其实 不好:带来了不严谨 或 丢失了一致性
------解决思路----------------------
赞同楼上观点,有时还得好好想一下,才能搞清楚。
是关于Pchar的,书上说Pchar是指针。
那么指针不是保存一个内存地址吗?下面有几个问题,请大神指点啊:
var
p:pchar;
s:string;
p1:pointer;
begin
p:='哈哈哈'; 问题1:p是个Pchar指针,为什么字符串可以直接赋值给它呢??
memo1.Lines.Add(p);// 哈哈哈
p1:=p; 问题2:p1是个无类型指针,这样做是把p的地址赋给p1了?爬p1:=p到底发生了什么???
memo1.Lines.Add(pchar(p1)); // 哈哈哈 可是这里不应该是p1^ 来显示内容吗??为什么p1就能显示出结果:'哈哈哈'??
p1:=@p; 问题3:p1:=@p ,p也是个指针,取值的时候不应该是p1^^吗?
memo1.Lines.Add(pchar(p1^));// 哈哈哈
end;
------解决思路----------------------
1、编译器会处理,取出"哈哈哈“字符串的内存地址赋值给指针变量。
2、指针变量在32位下都是4字节的,就是普通的赋值,就像x:=1;y:=x;一样。此时p^的值是"哈哈哈"所在地址上的第一个字节,ps:1个汉字2个字节。
3、p1:=@p, p1指向的是p变量的内存地址,此时p1^等于p的值,也就是"哈哈哈"的内存地址。同样p1^^等于p^,值同上面解释。
------解决思路----------------------
PChar 就是指向一个以Null 结尾的每个字符为一个字节的字符串的指针。 (可以看成是一个字符串)关键是它是每个字符为一个字节,这是windows一些函数参数必有的。
String是字符数组,以字符#0结尾。
在实际使用中,作为Text文本字符,PChar与String效果一致。所以:
1、Pchar类型,可以直接赋值字符;
2、p1:=p; P1得到p的值,此时p1等同于p,指向一个以Null 结尾的指针,由于它又是一个指针,所以必须Pchar(p1)强制返回Pchar类型;
3、p1:=@p; 两边都是地址,可以赋值,这是标准合法语句。p1就是纯内存地址, 只能使用pchar(p1^))返回Pchar类型。
------解决思路----------------------
补充:
Char是一个字节的字符;
PChar是指向以Null 结尾的由Char字符构成的字符串的指针。
这样,就好理解。
------解决思路----------------------
delphi的个别语法有点 为了方便而省略,其实 不好:带来了不严谨 或 丢失了一致性
------解决思路----------------------
赞同楼上观点,有时还得好好想一下,才能搞清楚。