当操作数是C中的指针时,编译器如何处理运算符+

时间:2013-07-21 04:39:05

标签: c pointers compiler-construction

例如。

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

在最后一行中,编译器如何判断此行中的+1不仅仅是一个常见的添加,而是一个地址添加。它如何区分常见的添加如 int i=1+2

有人可以在注册级解释吗?

2 个答案:

答案 0 :(得分:3)

向指针添加标量时,就像在执行&pointer[scalar]一样。例如:

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

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

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

答案 1 :(得分:1)

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

IOW,给出了一些类型T,还有一个像:

T *result = base + increment;

......它基本上等同于这样:

char *raw_address = (char *)base_address;

raw_address += increment * sizeof(T);

result = (T *)raw_address;

但是,请注意,在很多情况下,CPU可能能够在单个指令中处理至少某些类型(例如,1,2,4或8字节类型)的缩放(例如,英特尔) x86 / x64和compabibles可以像这样组合缩放和添加。)