关于New(var P:Pointer)的问题(100分)

  • 主题发起人 主题发起人 syt2000
  • 开始时间 开始时间
S

syt2000

Unregistered / Unconfirmed
GUEST, unregistred user!
New(var P:Pointer)是动态分配一块存储区并返回该块存储区的首地址,对吗?
如果这样:
TYPE
PMYINFO=^TMYINFO;
TMYINFO=record
xm:string;
age:integer;
end;

var p:PMYINFO;
用New(P)分配的内存大小应该是SizeOf(TMYINFO)对吗?
如果
var P:PChar;
不知道new(P)分配的存储区大小是多少?PChar的定义是PChar=^Char的吗?
在没有使用New(P)之前是不能使用P^:='ABCDF'的,对吗?
 
>用New(P)分配的内存大小应该是SizeOf(TMYINFO)对吗?


>var P:PChar;
>不知道new(P)分配的存储区大小是多少?PChar的定义是PChar=^Char的吗?
>在没有使用New(P)之前是不能使用P^:='ABCDF'的,对吗?

其实没有必要new(P)。直接用P = 'abcde'就可以,这里P是指向字符串常量的指针。
 
还是使用GetMem/FreeMem
 
1.对
2.new(P)分配的存储区为1个字节
3。不是
4。不能使用P^:='ABCDF,但是可以P^:='A';
 
对,pchar和^char还是有区别的。
pchar是指向字符串的指针(和C语言的char*兼容),而^char是指向字符的指针。
 
pchar和^char是一样的。 pchar也是指向一个字符的指针(不过通常我们都让它指向一个字符串的第一个字符而已)
 
1 既然New(P)只分配了一个字节的内存空间那么:
var P:PChar;
...
new(P)
//分配内存空间
GetHostName(P,63)
//API调用获取主机名称,其中参数P指向一块内存的首地址,取得的主机名称存放在这片内存中
dispose(P)
//释放内存空间
请问以上这段程序是否有问题?(实际运行结果没有问题)

2 有一个过程
Procedure SendData(buf:Pointer;len:integer)
var P:Pchar;
k:Byte;
begin
P:=buf;
k:=Byte(P[0])
//编译通过,运行结果正确
k:=Byte(P^[0])
//编译出错
end;

TYPE PByte=^BYTE
//与PChar=^Char一样
Procedure SendData(buf:Pointer;len:integer)
var P:PByte
//与上一过程不同
k:Byte;
begin
P:=buf;
k:=P^
//编译通过,运行结果正确,移动指针时只能通过INC(P);
k:=P^[0]
//编译出错
k:=P[0]
//编译出错,为什么P:PChar 可以通过,而P:PByte不能通过,应该是一样的呀?
end;


Procedure SendData(buf:Pointer;len:integer)
var P:PByteArray
//与上一过程不同
k:Byte;
begin
P:=buf;
k:=P^
//编译通过,运行结果正确,移动指针时只能通过INC(P);
k:=P^[0]
//编译通过
k:=P[0]
//编译通过
end;
为什么换为P:PByteArray后全部可以通过?


3 假如P是一个指针,如何理解P^,P^[0],P[0]之间的关系?
 
1. 您确信没问题吗? 呵呵, 告诉我GetHostName的返回值再说。(要不要打赌它不会是0呀)
2. 您太高估delphi编译器的智能化了。 它的智能化是根据borland的程序员事先告诉它规则实现的。 而borland的程序员只告诉它认识p[0]这种写法表示p^和p[n]这种写法实际是(p+n)^,并没有告诉它pbyte也能这样用而已(因为pchar主要用于表示字符串,因此编译器对它比较照顾而已)。
3. 解释同2, 如果您不信,那么运行时打开cpu窗口看一下它们的运行指令吧。
 
to Another_eYes:
如果pchar就是^char,那为什么会有下面这样的区别呢:
procedure TForm1.Button1Click(Sender: TObject);
var
c1: pchar;
c2: ^char;
s: string;
begin
c1 := '12345';
caption := c1;
//c2 := '12345
//不能这么写
//c2 := c1
//不能这么写
s := '12345';
c2 := @s[1];
//caption := c2
//不能这么写
end;
 
to zw84611: 您没看我的回答吗? 这全是编译器为了迎合c语言程序员的字符串操作习惯而特别允许pchar能做的操作。 但这并不意味着pchar就不是^char了。
他们的区别全部是编译器级的而不是代码级的。
 
ok,我明白了。
 
后退
顶部