#include<stdio.h>
int main(void){
int *ptr,a,b;
a = ptr;
b = ptr + 1;
printf("the vale of a,b is %x and %x respectively",a,b);
int c,d;
c = 0xff;
d = c + 1;
printf("the value of c d are %x and %x respectively",c,d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出值是
the vale of a,b is 57550c90 and 57550c94 respectively
the value of c d are ff and 100 respectively%
Run Code Online (Sandbox Code Playgroud)
事实证明,ptr + 1实际上是这样的?
小智 33
因为指针设计为与数组兼容:
*(pointer + offset)
Run Code Online (Sandbox Code Playgroud)
相当于
pointer[offset]
Run Code Online (Sandbox Code Playgroud)
因此,指针aritmetic在字节方面sizeof(pointer base type)不起作用,但在字节大小的块方面.
Gen*_* S. 24
考虑指针是什么......它是一个内存地址.内存中的每个字节都有一个地址.所以,如果你有int4个字节且地址是1000,那么1001实际上是第二个字节,int1002是第三个字节,1003是第四个字节.由于int编译器的大小可能因编译器而异,因此当你增加指针时,你必须得到一些中间点的地址int.因此,根据您的数据类型确定要跳过多少字节的工作是为您处理的,您可以使用您获得的任何值而不用担心它.
正如Basile Starynkvitch指出的那样,这个数量将根据sizeof指向的数据成员的属性而变化.很容易忘记即使地址是顺序的,对象的指针也需要考虑容纳这些对象所需的实际内存空间.
简短的回答
指针的地址将被增加sizeof(T),其中T在所述类型指向.因此,对于a int,指针将递增sizeof(int).
为什么?
首先,标准要求它.这种行为有用的原因(除了与C的兼容性之外)是因为当你有一个使用连续内存的数据结构时,比如一个数组或者std::vector,你可以通过简单地向指针添加一个来移动到数组中的下一个项目.如果要移动到容器中的第n个项目,只需添加n即可.
能够编写firstAddress + 2比编写简单得多firstAddress + (sizeof(T) * 2),并且有助于防止开发人员假设的错误sizeof(int)是4(可能不是)并编写代码firstAddress + (4 * 2).
事实上,当你说myArray[4],你说的时候myArray + 4.这就是数组索引从0开始的原因; 你只需要加0来得到第一个元素(即myArray指向数组的第一个元素),然后n得到第n个元素.
如果我想一次移动一个字节怎么办?
sizeof(char)保证大小为一个字节,因此char*如果您真的想一次移动一个字节,则可以使用a .