关于数组指针操作的一点疑问

wangwei244157887 2016-02-06 11:09:23
测试1

procedure test(abc:Cardinal);
var
i:Integer;
begin
for i:=0 to 3 do
begin
PInteger(abc)^:=i+10;
inc(abc,SizeOf(Integer ));
end;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
a:array[0..3] of Integer;
i:integer;
begin
for i:=0 to 3 do
begin
a[i]:=i;
end;
test(Cardinal(@a[0]));
for i:=0 to 3 do
begin
ShowMessage(IntToStr(a[i]));
end;
end;


测试2



procedure test(abc:PInteger);
var
i:Integer;
begin
for i:=0 to 3 do
begin
PInteger(abc)^:=i+10;
inc(abc,1);
end;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
a:array[0..3] of Integer;
i:integer;
begin
for i:=0 to 3 do
begin
a[i]:=i;
end;
test(@a[0]);
for i:=0 to 3 do
begin
ShowMessage(IntToStr(a[i]));
end;
end;


上面两个测试的结果是一样的,请问一下,传递Cardinal(@a[0]) 和 @a[0] 有何不一样,导致INC 的偏移量不一样
...全文
146 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2016-02-07
  • 打赏
  • 举报
回复
引用 5 楼 pathletboy 的回复:
[quote=引用 3 楼 wangwei244157887 的回复:] [quote=引用 1 楼 pathletboy 的回复:] inc指针和inc普通整数是不一样逻辑的。 inc指针是以指针所指向的结构大小为1个单位。
那你觉得abc:Cardinal 这是一个普通的整数?这应该是指针的地址啊[/quote] cardinal就是一个普通的无符号整数,只是他代表一个地址而已,并不是指针。[/quote] 恩,明白了,谢谢
pathletboy 2016-02-06
  • 打赏
  • 举报
回复
引用 3 楼 wangwei244157887 的回复:
[quote=引用 1 楼 pathletboy 的回复:] inc指针和inc普通整数是不一样逻辑的。 inc指针是以指针所指向的结构大小为1个单位。
那你觉得abc:Cardinal 这是一个普通的整数?这应该是指针的地址啊[/quote] cardinal就是一个普通的无符号整数,只是他代表一个地址而已,并不是指针。
「已注销」 2016-02-06
  • 打赏
  • 举报
回复
引用 2 楼 lyhoo163 的回复:
以32位为例。 一、二个数据类型的结构 1、Cardinal 无符号32位整数,范围0 .. 4294967295,长度4字节。 2、integer; 它是有符号32位整数,范围-2147483648 .. 2147483647,长度4字节。 二、指针地址 1、通过指针类型:^integer,它是指向一个integer类型的内存地址,它是有符号32位整数。但是作为内存,它的围只是0.. 2147483647,长度4字节。 2、Cardinal的范围,包含了正的integer数,因此它也能指定内存地址。 三、相关数据 1、a[0] 是整数数组的首位数组元素。 2、@a[0]是整数数组的首位数组元素的地址。它的数据类型是Integer(但是它没有负数)。 3、Cardinal(@a[0])); 是将整数数组的首位数组元素的地址,由integer类型强制转换为Cardinal类型。 打一个不切的比喻: 是将Integer的11111111值,转变为Cardinal的11111111。 四、二者比较 1、实际操作中,@a[0]和Cardinal(@a[0]))的值是相等的。 2、二者差异,二者在内存中二进制数,不一样。 3、实际效果,因为delphi是高级语言,作为地址二者的效果是一样的了。
嗯,认同" 1、实际操作中,@a[0]和Cardinal(@a[0]))的值是相等的。 "这个观点,但是为什么在INC里面体现的不一样呢?偏移量
「已注销」 2016-02-06
  • 打赏
  • 举报
回复
引用 1 楼 pathletboy 的回复:
inc指针和inc普通整数是不一样逻辑的。 inc指针是以指针所指向的结构大小为1个单位。
那你觉得abc:Cardinal 这是一个普通的整数?这应该是指针的地址啊
lyhoo163 2016-02-06
  • 打赏
  • 举报
回复
以32位为例。 一、二个数据类型的结构 1、Cardinal 无符号32位整数,范围0 .. 4294967295,长度4字节。 2、integer; 它是有符号32位整数,范围-2147483648 .. 2147483647,长度4字节。 二、指针地址 1、通过指针类型:^integer,它是指向一个integer类型的内存地址,它是有符号32位整数。但是作为内存,它的围只是0.. 2147483647,长度4字节。 2、Cardinal的范围,包含了正的integer数,因此它也能指定内存地址。 三、相关数据 1、a[0] 是整数数组的首位数组元素。 2、@a[0]是整数数组的首位数组元素的地址。它的数据类型是Integer(但是它没有负数)。 3、Cardinal(@a[0])); 是将整数数组的首位数组元素的地址,由integer类型强制转换为Cardinal类型。 打一个不切的比喻: 是将Integer的11111111值,转变为Cardinal的11111111。 四、二者比较 1、实际操作中,@a[0]和Cardinal(@a[0]))的值是相等的。 2、二者差异,二者在内存中二进制数,不一样。 3、实际效果,因为delphi是高级语言,作为地址二者的效果是一样的了。
pathletboy 2016-02-06
  • 打赏
  • 举报
回复
inc指针和inc普通整数是不一样逻辑的。 inc指针是以指针所指向的结构大小为1个单位。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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