C++ 指针在C+中递增+;

C++ 指针在C+中递增+;,c++,pointers,increment,C++,Pointers,Increment,这意味着什么:指针增量指向指针的下一个基类型的地址? 例如: p1++; // p1 is a pointer to an int 此语句是否意味着由p1指向的地址应该更改为下一个int的地址,或者它应该增加2(假设int为2字节),在这种情况下,特定地址可能不包含int 我的意思是,如果p1是,比如说0x442012,那么p1++会是0x442014(它可能是double地址的一部分)还是指向下一个int,它位于类似0x44201F的地址中 多亏了p1++产生了汇编语言指令,这些指令将p1

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

p1++;  // p1 is a pointer to an int
此语句是否意味着由
p1
指向的地址应该更改为下一个
int
的地址,或者它应该增加2(假设
int
为2字节),在这种情况下,特定地址可能不包含
int
我的意思是,如果
p1
是,比如说0x442012,那么
p1++
会是0x442014(它可能是double地址的一部分)还是指向下一个
int
,它位于类似0x44201F的地址中


多亏了p1++产生了汇编语言指令,这些指令将p1按其指向的大小递增。所以你得到了

(char*)p1=(char*)p1+sizeof(p1指向的对象)

(回答这个问题时)通常int是4字节,因此它会增加4,但这取决于您机器上的sizeof()

它不会转到“下一个int”

例如:假设一个4字节的地址,p1=0x20424(其中p1是int*)。然后

p1++


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

编译器将向指针的数值添加
sizeof(int)
(通常为4)。如果p1在增量之前为0x442012,则在增量之后为0x442012+4=0x442016

请注意,0x442012不是4的倍数,因此它不太可能是有效的四字节int的地址,尽管它适用于两字节int


它当然不会去寻找下一个整数。这需要魔法。

指针运算是以
sizoof(*Pointer)
倍数完成的,也就是说,对于指向int的指针,增量将前进到下一个整数(或者对于32位整数,增量为4字节)。

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

new_value = reinterpret_cast<char*>(p) + sizeof(*p);
new_value=reinterpret_cast(p)+sizeof(*p);
(假设指针指向non-
const
——否则强制转换将无法工作。)


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

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

  • 如果数组的长度大于
    n+1
    ,则指向索引
    n+1
    的元素
  • 如果数组的长度正好为
    n+1
    ,则数组的“超过结束”地址
如果
p1
未指向
int
类型的对象数组的元素,则
p1++
会导致未定义的行为

< C和C++语言对“地址”概念的唯一意义是指针对象的值。
< > C/C++的地址概念与汇编语言中的数字地址的概念之间的任何关系都纯粹是一个实现细节(尽管是一个非常常见的实现细节)。

NO.CUD> P1++<代码>意味着代码> P1+=1 < /代码>,没有别的。@康康德:除非你超载了++操作符。啊,乐趣在于重新定义操作符的含义(这是一个制造敌人的好方法);-)@即使这样也不会改变运算符的含义,因为您无法更改运算符的含义,所以在指针上,
++
始终具有相同的效果。@GregSchmit指针算术不是这样工作的<代码>p++将指针值添加1。但是你(和斯科特)似乎认为1指的是1字节。没有。看我的答案。@GregSchmit啊,这就是困惑的根源。所以:指针不是无符号整数。指针是指针-一种独特的类型!在幕后,许多/所有平台都将指针实现为无符号整数。但是,<>代码> P++<代码>不是在引擎盖下执行的,它是在C++空间中执行的。它相当于
p+=1
,而不是
p+=4
或其他任何东西
p+=1
依次在引擎盖下转换为指针对象大小的指针值增量。当然,his并不总是4,地址实现的类型与它无关。“4字节代表32位整数”,嗯,事实并非总是如此。最好说“(32/查尔比特)字节在32位整数”(使用C++的字节定义当然)。但再说一遍,谁说整数是32位的呢?现在几乎没有字节大小不同于8位的体系结构了。
int
类型不一定是32位,而是“32位整数”。我不明白你的意思…有很多微控制器和DSP都有奇怪的配置(有一个TI芯片,所有类型都是16位)。@Skizz,我没有说它们不是字节大小不同于8的架构-我说几乎没有。如果您查看大多数(可能是全部)CPU和MCU,您会看到8位字节。DSP确实是非常聪明的生物。有些是每字节24或32位。