为什么指向整数的指针增加4个字节?

时间:2012-11-16 08:23:18

标签: c++ c memory pointers increment

  

可能重复:
  Question about pointer increment

当我增加一个int指针时,它的地址有4个字节的间隙。为什么会这样?为什么int指针需要4个字节来存储而char需要2个字节?

6 个答案:

答案 0 :(得分:6)

当你增加A类型的指针时,你将指针向前移动指向内存中它所指向类型的大小。在你的机器上,int占用4个字节,因此指针移动4个字节。

至于“为什么int在我的机器上占用4个字节?”:

C ++标准说(4.9.1。第2段):

  

有五种标准的有符号整数类型:“signed char”,“short”   int“,”int“,”long int“和”long long int“。在此列表中,每种类型   提供至少与列表中前面的存储一样多的存储空间。   < ...>普通锭具有建筑所建议的自然尺寸   执行环境 [44] ;其他有符号整数类型是   为满足特殊需要而提供。

     
     

[44] :即大到足以包含任何值   INT_MIN和INT_MAX的范围,如标题中所定义。

基本上,基本类型的大小并不是一成不变的,而是实现定义的。 this SO question的已接受答案有一些相关信息。

答案 1 :(得分:2)

指向任何数据类型的指针的大小始终与系统支持的相同

如果系统为32位,则所有指针的大小为4个字节。

在执行ptr++ptr--时的指针运算中,根据此ptr指针指向的数据类型的大小进行增量和减量。

char *cptr;
int *iptr;
char c[5];
int a[5];
cptr=c;
iptr=a;

通过执行cptr++,您将获得c[1],指针将仅增加一个字节 您可以查看每个字符的地址。

同样iptr++会给你a[1]这里的指针增加4个字节。

int main()
{
 int i;
 for(i=0;i<5;i++)
 {
  printf("%p\t",&c[i]); //internally pointer arithmeitc: (c+sizeof(char)*i) , 
  printf("%p\n",&a[i]); //intenally pointer arithmetic : (a+sizeof(int)*i)
 }
}

int或其他数据类型的大小是实现定义的

答案 2 :(得分:2)

以下是一般规则:

  • 如果类型为T,则其大小N计算为sizeof(T)个字节。因此,如果将指针递增T*,则N类型的指针会增加1个字节。

    数学上,

    T  *p = getT();
    
    size_t diff = static_cast<size_t>(p+1) - static_cast<size_t>(p);
    
    bool alwaysTrue = (diff == sizeof(T)); //alwaysTrue is always true!
    

答案 3 :(得分:1)

因为指针指向的数据(int)的大小有4个字节大小所以指针增加4个字节(数据大小(int))

另一个例子:如果你有8字节大小的结构,你有指向这个结构的指针,这个指针的增量将是8字节:

struct test {
   int x;
   int y;
}

struct test ARRAY[50];
struct test *p=ARRAY; // p pointer is pointing here to the first element ARRAY[0]. ARRAY[0] is with size 8 bytes

p++; // this will increment p with 8 byte (size of struct test). So p now is pointing to the second element ARRAY[1]

答案 4 :(得分:1)

指针以它们指向的东西的大小(以字节为单位)递增。 ints在32位机器上占用4个字节。

答案 5 :(得分:1)

因为在您的计算机上sizeof (int) == 4,所以从int步进到下一个需要增加四个字节。

大多数整数类型在不同的计算机上具有不同的大小。 int必须至少有16位,并且应该是计算机的“自然”大小。大多数32位或64位平台选择32位作为“自然”大小,大多数计算机都有8位字节,因此int的4个字节是非常常见的大小。

然而,sizeof (char) == 1在所有计算机上,所以我很惊讶你说“一个字符需要2个字节”。它应该只需要一个。