array[0..79] of Char 与 array[1..80] of Char 区别?(100分)

  • 主题发起人 主题发起人 dragonhux
  • 开始时间 开始时间
D

dragonhux

Unregistered / Unconfirmed
GUEST, unregistred user!
array[0..79] of Char 与 array[1..80] of Char 区别,有区别吗?
看下面的两个例子:
例子一:
uses SysUtils;
var
A: array[0..79] of Char;
S: String;
begin
S := 'Honk if you know Blaise.';
StrPCopy(A, S);
Canvas.TextOut(10, 10, string(A));
end;

例子二:
uses SysUtils;
var
A: array[1..80] of Char;
S: String;
begin
S := 'Honk if you know Blaise.';
StrPCopy(A, S);
Canvas.TextOut(10, 10, string(A));
end;

改成例子二的方式,就会出现:
[Error] Unit1.pas(33): Incompatible types: 'Array' and 'PAnsiChar'

在array的定义内存实现上难道有区别? :-(
 
当然有区别了,第一中定义说明数组有80个元素,0..79标号。第二个要用你可以定义0...80,第一个0不用,用1...80就可以了,数组的第一个元素标号从0开始。
 
可能是在 System.pas 定的吧,必须从0开始
type
TPCharArray = packed array[0..(MaxLongint div SizeOf(PChar))-1] of PChar;
 
是调用StrLCopy函数,所以从0开始。
 
这个问题,我觉得应该是Delphi编译器的问题。在Delphi中,默认将以0开头的字符数组当成是PChar来看待,而不是以0开头的字符数组则不这么看待,这样,在遇到需要PChar参数的函数调用时,Delphi会自动将以0开头的字符数组转换成PChar,而不是以0开头的将不进行这种隐含的转换。
上面的程序,当定义成A: array[1..80] of Char时,需要这样调用:
StrPCopy(@A[1], S);
 
array[0..79] of Char; 从 0 开始计数,可以转换为 PChar 类型。非 0 开始计数,不可以转换为 PChar 类型。这是 Delphi 编译器规定的。
StrPCopy 需要 PChar 类型参数,因此第二种情况是错误的。
 
要记住,数组不管是什么类型的,其下标永远是从0开始的!!!!!!!!!!!!!!
 
楼上的是在误导,呵呵。
下标仅仅是方便应用而采用的对数组的一种访问方法,下标完全可以不从0开始。
如果要咬文嚼字,那只要有个相对位置,所有的内存地址你都可以说是从0开始。
 
区别就是 low high的值不一样、
 
转化时初始位址不一样吧
 
下标不是0开头时不能直接用数组名要这样 StrPCopy(@A[1], S);
 
C语言的下标才是从0开始吧
delphi应该都可以吧
 
应该是一样的,只是下标开始不一样,不过建议从零开始,这是个习惯,有些东西还是要遵循的
 
例子二:
uses SysUtils;
var
A: array[1..80] of Char;
S: String;
begin
S := 'Honk if you know Blaise.';
StrPCopy(@A[1], S);
Canvas.TextOut(10, 10, string(A));
end;
 
这就叫强类型语言。。。。与储存结构无关
在Delphi Help中关于Static Array有一段:
An array type of the form array[0..x] of Char is called a zero-based character array. Zero-based character arrays are used to store null-terminated strings and are compatible with PChar values.

也就是,array[0..x] of Char是有特殊照顾,可以与PChar类型兼容的。其他的一概过不了编译器这关。。。。
 
后退
顶部