为什么指针+ 1实际上加4

mko*_*mko 21 c pointers

#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指向的数据成员的属性而变化.很容易忘记即使地址是顺序的,对象的指针也需要考虑容纳这些对象所需的实际内存空间.


Bas*_*tch 7

你真的应该花时间阅读一本好的C编程语言书(比如K&R"C编程语言")

指针算术是一个棘手的主题.指针添加意味着传递给下一个指向的元素.因此地址由sizeof 指向的元素递增.


OMG*_*chy 6

简短的回答

指针的地址将被增加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 .