我们有一个数组:int p[100]
。
为什么p[i]
等同于*(p+i)
而不是*(p+i*sizeof(int))
?
答案 0 :(得分:7)
为什么p [i]等同于
*(p+i)
而不是*(p+i*sizeof(int))
?
因为*(p+i)
也与*((int *) ((char *) p + i * sizeof (int)))
相同。向指针添加整数i
时,指针的移动速度是指向对象大小的i
倍。
答案 1 :(得分:3)
为什么p [i]相当于*(p + i)而不是*(p + i * sizeof(int))?
因为某些处理器体系结构无法取消引用指向不指向按其类型大小对齐的地址的指针。这基本上意味着指向一个 4字节整数应始终指向4的倍数的地址。
当程序试图取消引用未对齐的指针时,可能会导致“总线错误”。您可以阅读更多相关信息here on Wikipedia。
您要求的是p + 1
应该将指针增加一个字节而不是一个元素。如果语言的设计方式与p++
不同,那么写char
对其他类型的指针不再有效。当程序员忘记写* sizeof(*p)
进行添加时,它也会导致指针对齐的大问题。
这可能会让人感到困惑,但是有充分理由说明为什么语言是这样设计的。
答案 2 :(得分:1)
这是因为在将i
添加到p
之前,编译器会在内部计算p
指向的数据类型的大小,然后将其i
次添加到p
答案 3 :(得分:0)
数组元素是连续存储的。
*(p+i)
这里p具有数组p的基地址,i的范围是0到99。
因此,您可以通过递增 i 来迭代 p 的元素。
答案 4 :(得分:0)
为什么p [i]等同于
*(p+i)
而不是*(p+i*sizeof(int))
?
这是因为指针算术工作的方式:向指针添加整数n
会产生指向第一个n
元素(不是字节)的指针on(0-based)。