例如。
int a[]={3,4};
int *p1=a;
int *p2=a+1;
在最后一行中,编译器如何判断此行中的+1
不仅仅是一个常见的添加,而是一个地址添加。它如何区分常见的添加如
int i=1+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可以像这样组合缩放和添加。)