为什么我的strCopy实现工作?

Slu*_*ger 5 c++

这是strCopy的一个实现

void strcopy2(char *dst, char const *src){
    while ((*dst++ = *src++))
        ;
}
Run Code Online (Sandbox Code Playgroud)

我们的教授要求我们在不使用指针的情况下重现这段代码,所以我想出了以下函数:

void strcopy(char dst[], char const src[]){
    size_t i = 0;
    while (dst[i] = src[i++])
        ;
}
Run Code Online (Sandbox Code Playgroud)

它运行良好,但我意识到,在引擎盖下,函数必须仍然使用指针,因为我们无处可返回任何值.换句话说,我虽然最后一个函数会使用pass by value但显然并非如此.那么在水下发生了什么,这两种方法之间究竟有什么区别吗?

Lig*_*ica 14

不只是在引擎盖......既dstsrc,尽管外表,实际上指针!该[]参数列表语法是语法糖(或语法辣椒真的),但它骗你; 这些都char* dstchar const* src实数.

8.3.5/5 [dcl.fct]功能:

在确定每个参数的类型之后,将"T数组"或函数类型T的任何参数调整为"指向T的指针".

  • @Trevir在这种背景下它们是相同的. (9认同)
  • @UKMonkey请查看@Lightness的评论.声称不是"数组是指针",因为它们不是.声明是"`dst`和`src`是指针",它们是.我添加了标准报价. (6认同)
  • 不,@特雷维尔.那是不对的.OP的两个功能(略有不同),但不是出于任何原因与它们的参数有关. (5认同)
  • 为了避免疑问,每个人,这是一个C++怪癖(实际上是一个C怪),如果你写`void foo(int array [])`这是_literally_翻译为_identical_到`void foo(int*在各个方面.是的,这是愚蠢和令人困惑的.感谢Patrick为此答案添加了相关标准. (5认同)
  • @Trevir:我从未声称两个[功能]都是一样的.我实际上已经两次说了相反的话. (5认同)
  • @Trevir:事实并非如此.它们字面意思相同.我不是说数组是指针(它们不是); 但在这个参数列表中它们是相同的.您链接的问答是不同的. (4认同)
  • @UKMonkey:你错了. (4认同)
  • @Trevir的实现明显不同,因为......它们是不同的(即特定表达式在函数内部具有略微不同的副作用.这不会改变函数签名中的事实,`T []`和`T*`字面意思是同一类型. (2认同)
  • @Slugger:我的直觉是他不精确地描述你所做的事情 - 也就是说,使用数组索引表示法而不是指针增量表示法.希望他不会在乎你在指针上直接使用数组索引表示法;)(虽然根据我对教授的经验,坦率地说他甚至可能都不知道!)也许你可以得到额外的信用(并且同时对冲你的赌注)时间)通过在解决方案下面描述/解释所有这些.另外,你需要纠正`i`的用法(根据Pete在Q下方的评论). (2认同)