1

例如。

int a[]={3,4};
int *p1=a;
int *p2=a+1;

在最后一行,编译器怎么知道+1这一行中的不是普通的加法,而是地址加法。它如何与常见的添加如 int i=1+2.

有人可以在寄存器级别解释吗?

4

2 回答 2

3

当您将标量添加到指针时,就像在做&pointer[scalar]. 例如:

int * path = 0x1234;
path += 1;
printf("%p\n", path);

0x1238上面的代码在 32 位系统上打印出来。

编辑:澄清一下,添加n到指针会按n * sizeof(element)字节偏移指针。

于 2013-07-21T04:43:29.960 回答
1

它根据要添加的对象的类型进行区分。如果它是一个指针,则地址会增加您指定的数字乘以指针指定指向的对象的大小。

IOW,给定一些类型 T,并添加如下内容:

T *result = base + increment;

...它基本上相当于这样的东西:

char *raw_address = (char *)base_address;

raw_address += increment * sizeof(T);

result = (T *)raw_address;

但是请注意,在相当多的情况下,CPU 可能能够在单个指令(例如,Intel x86/x64)中处理至少某些类型(例如,1、2、4 或 8 字节类型)的缩放和兼容可以像这样结合缩放和加法)。

于 2013-07-21T04:46:21.777 回答