例如。
int a[]={3,4};
int *p1=a;
int *p2=a+1;
在最后一行,编译器怎么知道+1
这一行中的不是普通的加法,而是地址加法。它如何与常见的添加如
int i=1+2
.
有人可以在寄存器级别解释吗?
例如。
int a[]={3,4};
int *p1=a;
int *p2=a+1;
在最后一行,编译器怎么知道+1
这一行中的不是普通的加法,而是地址加法。它如何与常见的添加如
int i=1+2
.
有人可以在寄存器级别解释吗?
当您将标量添加到指针时,就像在做&pointer[scalar]
. 例如:
int * path = 0x1234;
path += 1;
printf("%p\n", path);
0x1238
上面的代码在 32 位系统上打印出来。
编辑:澄清一下,添加n
到指针会按n * sizeof(element)
字节偏移指针。
它根据要添加的对象的类型进行区分。如果它是一个指针,则地址会增加您指定的数字乘以指针指定指向的对象的大小。
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 字节类型)的缩放和兼容可以像这样结合缩放和加法)。