当我增加一个int指针时,它的地址有4个字节的间隙。为什么会这样?为什么int指针需要4个字节来存储而char需要2个字节?
答案 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个字节”。它应该只需要一个。