【问题标题】:Why a pointer to an integer increments by 4 bytes? [duplicate]为什么指向整数的指针增加 4 个字节? [复制]
【发布时间】:2012-11-04 22:59:03
【问题描述】:

可能重复:
Question about pointer increment

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

【问题讨论】:

  • 请向我们展示您得出char占用2个字节的代码。

标签: c++ c memory pointers increment


【解决方案1】:

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

如果系统是 32 位的,那么所有指针的大小都是 4 字节。

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

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 或其他数据类型的大小由实现定义

【讨论】:

  • 严格来说,不一定是所有的指针。可以有其他与系统位大小无关的指针系统...
  • 这就是我要问的,为什么它需要 4 个字节而不是 5 或 6 个字节?
  • @l4zyw0rm:指针运算是这样发生的,所以它是
【解决方案2】:

因为指针指向的数据大小(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]

【讨论】:

    【解决方案3】:

    指针以它们所指向的事物的字节大小递增。 int 在 32 位机器上占用 4 个字节。

    【讨论】:

    • 这就是我要问的问题,为什么它需要 4 个字节而不是 5 或 6 个字节?
    • 根据定义。一个字节是 8 位。 8 乘以 4 = 32。在具有 32 位整数的机器上,一个 int 占用 4 个字节。
    • @Matthew'Cogwheel'Orlando,通常是这样。从技术上讲,它可以是与 8 位不同的位数。
    • 在 64 位机器上怎么样
    【解决方案4】:

    当你增加一个类型 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 的答案包含一些关于它的信息。

    【讨论】:

    • 这就是我要问的问题,为什么它需要 4 个字节而不是 5 或 6 个字节?
    • @l4zyw0rm,我已经更新了答案
    【解决方案5】:

    这是一般规则:

    • 如果类型为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!
      

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 2013-08-08
        • 1970-01-01
        • 2019-09-28
        相关资源
        最近更新 更多