1

可能重复:
关于指针增量的问题

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

4

6 回答 6

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 范围内的任何值,如 header 中所定义。

基本上,基本类型的大小不是一成不变的,而是由实现定义的。这个 SO question的公认答案有一些关于它的信息。

于 2012-11-16T08:25:38.577 回答
2

这是一般规则:

  • 如果类型为T,则其大小Nsizeof(T)字节计算。因此,如果您将指针T*增加.N1

    数学上,

    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!
    
于 2012-11-16T08:27:32.410 回答
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或其他数据类型由实现定义

于 2012-11-16T08:24:35.400 回答
1

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

于 2012-11-16T08:25:20.543 回答
1

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

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

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

于 2012-11-16T08:28:29.283 回答
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]
于 2012-11-16T08:25:02.373 回答