我最初认为将指向数组的指针传递给函数的主要优点是防止复制整个数组。然而,这个问题的答案指出,即使函数的参数是int []它,它也会衰减为指针。我编写了示例代码并自己验证了这一点。
我已经做了谷歌搜索和阅读,主要是我看到的是,从历史上看,使用避免额外算术计算数组索引所需的指针有一些优势。但文章还表示,今天这不再是问题,因为编译器和芯片制造商已经进行了积极的优化,数组索引也同样快。
如果这是真的,显式传递指针是否有任何实际优势?
我不知道这个问题是否会引起基于意见的回应。如果是这样,那不是我的本意。我希望得到一个明确说明明确传递指针的回应。谢谢。
编辑 我读过的文章的链接:
传递int *和int []是相同的; 后者只是一种替代语法。但是,传递int (*)[N](指向数组的指针类型而不仅仅是指向其第一个元素的指针)并不相同。如果是
void foo(int (*p)[N]);
int array[N];
foo(&array);
Run Code Online (Sandbox Code Playgroud)
它的传递方式没有机械差异;区别仅在于类型,因此需要*在被调用者中编写额外的内容((*p)[i]而不是p[i])。
但是,一旦您拥有多维数组,传递指向数组类型的指针就很有意义,例如:
void foo(int (*p)[N]);
int array[M][N];
foo(array);
Run Code Online (Sandbox Code Playgroud)
这里没有&before array,因为它衰减到指向其第一个元素(第一个一维int [N]“行”)的指针,产生一个指向数组的指针类型。然后被调用者能够访问二维数组作为p[i][j]。