在:http://www.fredosaurus.com/notes-cpp/arrayptr/26arraysaspointers.html
在:指针添加和元素大小
有以下代码:
// Assume sizeof(int) is 4.
int b[100]; // b is an array of 100 ints.
int* p; // p is a a pointer to an int.
p = b; // Assigns address of first element of b. Ie, &b[0]
p = p + 1; // Adds 4 to p (4 == 1 * sizeof(int)). Ie, &b[1]
最后一行的“p”怎么变成“4”?
感谢。
答案 0 :(得分:15)
(我假设你在最后一行表示“1”,而不是“p”)
C和C ++中的指针运算是逻辑添加,而不是数字添加。将一个指针添加到指针意味着“生成一个指向在此存储器之后的内存中的对象的指针”,这意味着编译器会根据指向的对象的大小自动扩展指针递增的任何内容。这可以防止您将指针指向对象的中间,或指向未对齐的指针,或两者兼而有之。
答案 1 :(得分:4)
你发布的代码中的注释解释了它:向指针添加整数x会使指针的值增加x乘以它指向的类型的大小。
这很方便,因为以较小的增量更改指针通常没有意义 - 你不希望它指向其中一个元素的中间。
答案 2 :(得分:2)
因为p是指向大小为4字节的类型的指针。指针上的+
运算符实际上是指针 shift 。编译器知道指向类型的大小并将其移动适当的值
如果您将int
更改为short
,则p将移位2个字节