指针在C ++中递增

时间:2011-06-27 11:52:25

标签: c++ pointers increment

这是什么意思:指针增量指向指针的下一个基本类型的地址?
例如:

p1++;  // p1 is a pointer to an int

此语句是否意味着p1指向的地址应更改为下一个int的地址,或者它应该仅增加2(假设int为2个字节),在这种情况下,特定地址可能不包含int
我的意思是,如果p1是0x442012,那么p1++将是0x442014(可能是双重地址的一部分),还是指向下一个int地址如0x44201F?

由于

5 个答案:

答案 0 :(得分:10)

指针运算并不关心指针对象的内容或有效性。它将使用以下公式简单地递增指针地址:

new_value = reinterpret_cast<char*>(p) + sizeof(*p);

(假设指向非const的指针 - 否则演员阵容将无效。)

也就是说,它会将指针增加sizeof(*p)个字节,而不管指针值和内存对齐等。

答案 1 :(得分:4)

编译器会将sizeof(int)(通常为4)添加到指针的数值。如果p1在递增之前是0x442012,那么在递增之后它将是0x442012 + 4 = 0x442016。

请注意,0x442012不是4的倍数,所以它不太可能是有效的4字节int的地址,尽管它对于你的双字节整数是合适的。

肯定不会去寻找下一个整数。这需要魔法。

答案 2 :(得分:3)

p1 ++产生汇编语言指令,它将p1的大小增加到指向的位置。所以你得到了

(char *)p1 = (char *)p1 + sizeof (object pointed to by p1)

(当回答这个问题时)通常一个int是4个字节,所以它会增加4,但它取决于你机器上的sizeof()。

转到“下一个int”。

示例:假设4字节地址且p1 = 0x20424(其中p1是int *)。然后

p1++

将p1的新值设置为0x20428。不是0x20425。

答案 3 :(得分:1)

如果p1指向类型为n的对象数组的索引int的元素(为此目的,非数组对象计为长度为1的数组) ,然后在p1++之后,p1是:

  • 如果数组的长度大于n+1,则指向索引n+1的元素。
  • 过去的结局&#39;数组的地址,如果数组的长度恰好是n+1
如果p1++未指向p1类型的对象数组的元素,则

int会导致未定义的行为。

C和C ++语言赋予&#34;地址&#34;的概念的唯一含义。是指针对象的值。

C / C ++的地址概念与汇编语言中您考虑的数字地址的概念之间的任何关系纯粹是一个实现细节(尽管是一个非常常见的实现细节)

答案 4 :(得分:0)

指针算法以sizoeof(*pointer)倍数完成 - 也就是说,对于指向int的指针,increment将前进到下一个整数(或32位整数的4个字节)。