可能重复:
关于指针增量的问题
当我增加一个 int 指针时,它的地址有 4 个字节的间隙。为什么会这样?为什么 int 指针需要 4 个字节来存储而 char 需要 2 个字节?
当您增加类型 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的公认答案有一些关于它的信息。
这是一般规则:
如果类型为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!
指向任何数据类型的指针的大小始终与系统支持的大小相同
如果系统是 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
或其他数据类型由实现定义
指针以它们指向的事物的字节大小递增。int 在 32 位机器上占用 4 个字节。
因为,在您的计算机上sizeof (int) == 4
,,所以从一个步进int
到下一个需要增加四个字节。
大多数整数类型在不同的计算机上具有不同的大小。int
必须至少有 16 位,并且应该是计算机的“自然”大小。大多数 32 位或 64 位平台选择 32 位作为“自然”大小,并且大多数计算机都有 8 位字节,因此 4 字节是int
.
但是,sizeof (char) == 1
在所有计算机上,我很惊讶您说“一个字符需要 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]