传递数组,固定大小的数组和数组的基地址之间的区别作为函数参数

mr5*_*mr5 56 c++ arrays pointers

如果我想将已知或未知大小的数组作为函数参数传递,我对使用哪种语法感到困惑.

假设我有这些变体用于此目的:

void func1(char* str) {
    //print str
}

void func2(char str[]) {
    //print str
}

void func3(char str[10]) {
    //print str
}
Run Code Online (Sandbox Code Playgroud)

使用这些中的每一个有什么利弊?

Kon*_*lph 72

所有这些变体都是相同的.C只是让你使用替代拼写,但即使是最后一个用数组大小​​注释的变量也会衰减为普通指针.

也就是说,即使使用最后一个实现,您也可以使用任意大小的数组调用该函数:

void func3(char str[10]) { }

func("test"); // Works.
func("let's try something longer"); // Not a single f*ck given.
Run Code Online (Sandbox Code Playgroud)

不用说,应该使用它:它可能会给用户一种虚假的安全感("哦,这个函数只接受一个长度为10的数组,因此我不需要自己检查长度").

由于亨里克说,正确的方法在C++中是使用std::string,std::string&std::string const&(取决于你是否需要修改的对象,以及是否要复制).


Mor*_*enn 20

请注意,在C++中,如果在编译时已知数组的长度(例如,如果传递了字符串文字),则实际上可以获得其大小:

template<unsigned int N>
void func(const char(&str)[N])
{
    // Whatever...
}

int main()
{
    func("test"); // Works, N is 5
}
Run Code Online (Sandbox Code Playgroud)

  • 这将为传递的每个新长度的文字创建一个(调整的)“func”机器代码副本。 (2认同)

Hen*_*rik 11

在C++中,使用void func4(const std::string& str).


aut*_*tic 9

这些都是功能相同的.将数组传递给C中的函数时,数组会隐式转换为指向数组第一个元素的指针.因此,这三个函数将打印相同的输出(即指针的大小char).

void func1(char* str) {
    printf("sizeof str: %zu\n", sizeof str);
}

void func2(char str[]) {
    printf("sizeof str: %zu\n", sizeof str);
}

void func3(char str[10]) {
    printf("sizeof str: %zu\n", sizeof str);
}
Run Code Online (Sandbox Code Playgroud)

此转换仅适用于数组的第一个维度.A char[42][13]转换为a char (*)[13],而不是 a char **.

void func4(char (*str_array)[13]) {
    printf("sizeof str_array: %zu\n"
           "sizeof str_array[0]: %zu\n", sizeof str_array, sizeof str_array[0]);
}
Run Code Online (Sandbox Code Playgroud)

char (*)[13]是的类型str_array.这就是你写"指向13 chars 数组的指针"的方法.这也可以写成void func4(char str_array[42][13]) { ... },虽然42在功能上毫无意义,你可以通过实验看到,将不同大小的数组传递到func4.

在C99和C11(但不是C89或C++)中,您可以将指向不同大小的数组的指针传递给函数,方法是将其大小与其一起传递,并在其中包含大小标识符[square brackets].例如:

void func5(size_t size, char (*str_array)[size]) {
    printf("sizeof str_array: %zu\n"
           "sizeof str_array[0]: %zu\n", sizeof str_array, sizeof str_array[0]);
}
Run Code Online (Sandbox Code Playgroud)

这声明了一个指向大小为 char s 的数组的指针.请注意,必须取消引用指针才能访问该数组.在上面的示例中,sizeof str_array[0]计算数组的大小,而不是第一个元素的大小.例如,要访问第11个元素,请使用(*str_array)[11]str_array[0][11].