【发布时间】:2012-11-04 22:59:03
【问题描述】:
当我增加一个 int 指针时,它的地址有 4 个字节的间隙。为什么会这样?为什么 int 指针需要 4 个字节来存储而 char 需要 2 个字节?
【问题讨论】:
-
请向我们展示您得出
char占用2个字节的代码。
标签: c++ c memory pointers increment
当我增加一个 int 指针时,它的地址有 4 个字节的间隙。为什么会这样?为什么 int 指针需要 4 个字节来存储而 char 需要 2 个字节?
【问题讨论】:
char占用2个字节的代码。
标签: c++ c memory pointers increment
指向任何数据类型的指针的大小始终与系统支持的大小相同
如果系统是 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 或其他数据类型的大小由实现定义
【讨论】:
因为指针指向的数据大小(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]
【讨论】:
指针以它们所指向的事物的字节大小递增。 int 在 32 位机器上占用 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 的答案包含一些关于它的信息。
【讨论】:
这是一般规则:
如果类型为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!
【讨论】:
因为在您的计算机上,sizeof (int) == 4,所以从一个int 步进到下一个需要增加四个字节。
大多数整数类型在不同的计算机上具有不同的大小。 int 必须至少有 16 位,并且应该是计算机的“自然”大小。大多数 32 位或 64 位平台选择 32 位作为“自然”大小,并且大多数计算机都有 8 位字节,因此 4 字节对于int 来说是非常常见的大小。
但是,sizeof (char) == 1 在所有计算机上,所以我很惊讶你说“一个字符需要 2 个字节”。应该只需要一个。
【讨论】: