繁体   English   中英

将数组传递给 C++ 中的 function 的不同语法

[英]Different syntax of passing an array to a function in C++

#include <stdio.h>

void test2(int (&some_array)[3]){
  // passing a specific sized array by reference? with 3 pointers?
}

void test3(int (*some_array)[3]){
  // is this passing an array of pointers?
}

void test1(int (some_array)[3]){
  // I guess this is the same as `void test1(some_array){}`, 3 is pointless.
}

int main(){
  //
  return 0;
}

以上3种语法有什么区别? 我在每个部分都添加了评论,以使我的问题更加具体。

void test2(int (&some_array)[3])

这是传递对 3 个int数组的引用,例如:

void test2(int (&some_array)[3]) {
    ...
}

int arr1[3];
test2(arr1); // OK!

int arr2[4];
test2(arr2); // ERROR!
 void test3(int (*some_array)[3])

这是将指针传递给 3 个int的数组,例如:

void test3(int (*some_array)[3]) {
    ...
}

int arr1[3];
test3(&arr1); // OK!

int arr2[4];
test3(&arr2); // ERROR!
 void test1(int (some_array)[3])

现在,这就是事情变得有点有趣的地方。

在这种情况下括号是可选的(在引用/指针情况下它们不是可选的),所以这等于

void test1(int some_array[10])

这反过来只是语法糖

void test1(int some_array[])
(是的,数字被忽略)

这反过来只是语法糖

void test1(int *some_array)

因此,不仅数字被忽略,而且它只是一个简单的传入指针。任何固定数组都会衰减为指向其第一个元素的指针,这意味着可以传入任何数组,即使声明仅建议允许使用 3 个元素,例如:

void test1(int (some_array)[3]) {
    ...
}

int arr1[3];
test1(arr1); // OK!

int arr2[10];
test1(arr2); // ALSO OK!

int *arr3 = new int[5];
test1(arr3); // ALSO OK!
delete[] arr3;

现场演示

在您的代码中, test3是传递指向数组的指针的正确方法,如果这是您想要的。

void foo(int (*some_array)[3])
{
    for (size_t i = 0; i < 3; ++i) {
        printf("some_array[%zu]: %d\n", i, (*some_array)[i]);
    }
}

int main()
{
    int a[3] = { 4, 5, 6 };

    foo(&a);

    return 0;
}

运行此代码会返回您期望的结果:

some_array[0]: 4
some_array[1]: 5
some_array[2]: 6

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM