C++ 指针数学与数组索引
我知道这个问题已经讨论了很多次,但今天我遇到了一个案例,它动摇了我对指针数学/数组索引的理解 正如我一直所理解的,&mybuff[10]和(&mybuff+10)是引用相同内存的等效方法 然而,我花了一上午时间与一个案例进行斗争,其中:C++ 指针数学与数组索引,c++,c,pointers,C++,C,Pointers,我知道这个问题已经讨论了很多次,但今天我遇到了一个案例,它动摇了我对指针数学/数组索引的理解 正如我一直所理解的,&mybuff[10]和(&mybuff+10)是引用相同内存的等效方法 然而,我花了一上午时间与一个案例进行斗争,其中: memcpy(&mybuff+10,&in,8); 在启用优化的情况下编译时,缓冲区溢出,在编译以进行调试时工作正常 而与此同时 memcpy(&mybuff[10],&in,8); 在这两种情况下都很好 非常感谢您的建议
memcpy(&mybuff+10,&in,8);
在启用优化的情况下编译时,缓冲区溢出,在编译以进行调试时工作正常
而与此同时
memcpy(&mybuff[10],&in,8);
在这两种情况下都很好
非常感谢您的建议。有关运算符的优先级顺序,请参阅&mybuff+10
类似于(&mybuff)+10
&mybuff[10]
类似于和(mybuff[10])
编辑
还有一些指针正确的语法是
mybuff+10
而不是&mybuff+10
,它表示移动到数组中的位置10并复制8个字节(根据memcpy语句)。但是仍然不知道您是否可以实际保留额外的8个字节。我认为您有一些指针问题。如果mybuff是指针,那么
mybuff+10==&(mybuff[10])
这与您的
&mybuff+10
不同。为了示例,我将为mybuff
创建一个声明:
char mybuff[123];
现在,&mybuff+10
在&mybuff
上执行指针算术,其类型为“指向123个字符的数组的指针”。这与普通mybuff
不同,后者(指针衰减后)的类型为“指针指向字符”。这两个表达式的位值是相同的,但由于它们是指向不同大小对象的指针,因此在指针算法下它们的行为不同
&mybuff+10
意味着您希望跨过类型中123个字符数组中的10个(鉴于声明,这是毫无意义的,并且可能是错误的),而mybuff+10
只是说您希望跨过10个单独的字符。(&mybuff+10)
和&mybuff[10]
是不等价的,但是&mybuff[10]
和mybuff+10
是。&mybuff[10]
相当于&mybuff[0]+10
,相当于mybuff+10
数组索引是根据指针算法定义的p[i]
表示*(p+i)
(在p
或i
是更复杂的表达式的情况下,我忽略了额外括号的需要),其中p
是指针值,i
是整数值
琐事:由于加法,即使是指针+整数加法,也是可交换的,p[i]
也可以写成i[p]
。是的,4[“Hello”]=“o”
。为了将来阅读您的代码的人,请不要使用这些知识
<>是C和(C++中的数组和指针之间的关系)的一个极好的参考,其中规则几乎相同。(我可以直接链接到第6节,但我喜欢鼓励人们浏览它;整个内容都值得一读。)它在调试模式下工作的原因是,在调试模式下,内存为您初始化,分配也比实际大小大 tee-hee在双关语中要求“指针”。
&mybuff[10]
的计算结果为&(*(mybuff+10))
,这与&mybuff+10
不同。请记住,像[]
这样的后缀运算符比像&
这样的一元运算符具有更高的优先级。可能重复@user12861:到这里-我是说这个答案不清楚。我个人至少知道这么多C++。USE12861:我相信OP理解我管他的是什么。很清楚,不太清楚&mybuff[10]
解析为&(mybuff[10])
,评估为&(*(mybuff+10))
。这相当于mybuff+10
。只需删除或编辑我们答案的第一行,因为初学者不清楚如果我们想完全成为语言律师,正确的说法是,只要&mybuff[10]
有定义的行为,该行为就与mybuff+10
相同。但是,如果mybuff是一个10元素数组,那么&mybuff[10]
中隐含的差异超过了对象的末尾,可以说触发了未定义的行为(尽管我认为我看到其他人认为,当操作符的地址立即使用*foo
时,它不算作解除引用),而定义了mybuff+10
。