Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针数学与数组索引_C++_C_Pointers - Fatal编程技术网

C++ 指针数学与数组索引

C++ 指针数学与数组索引,c++,c,pointers,C++,C,Pointers,我知道这个问题已经讨论了很多次,但今天我遇到了一个案例,它动摇了我对指针数学/数组索引的理解 正如我一直所理解的,&mybuff[10]和(&mybuff+10)是引用相同内存的等效方法 然而,我花了一上午时间与一个案例进行斗争,其中: memcpy(&mybuff+10,&in,8); 在启用优化的情况下编译时,缓冲区溢出,在编译以进行调试时工作正常 而与此同时 memcpy(&mybuff[10],&in,8); 在这两种情况下都很好 非常感谢您的建议

我知道这个问题已经讨论了很多次,但今天我遇到了一个案例,它动摇了我对指针数学/数组索引的理解

正如我一直所理解的,&mybuff[10]和(&mybuff+10)是引用相同内存的等效方法

然而,我花了一上午时间与一个案例进行斗争,其中:

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