c++中二维数组中引用传递的问题

Having a problem with pass by reference in two dimensional array in c++

本文关键字:问题 引用 二维数组 c++      更新时间:2023-10-16

我有一个叫做names的变量,它是一个二维数组。我像下面这样声明它,以便最多有5个名称,每个名称将由256个字符组成。

int main(){
    char names[5][256];
    strcpy(names[0],"John");
    strcpy(names[1],"Matt");
    printf("%dn",sizeof(names)/256);        //this prints out 5 which is correct
    passit(names);             
}
void passit(char names[][256]){
    printf("%dn",sizeof(names)/256);        //this prints out 8 which seems to be a size of pointer
} 

我该如何改变这一点,以便在passit函数中,元素的数量将正确打印?

你的代码是c风格的。如果你真的在写c++,那么我建议使用std::cout, std::vectorstd::string:

void passit(std::vector<std::string> const& names) {
    std::cout << names.size();
} 
int main() {
    std::vector<std::string> names(5);
    names[0] = "John";
    names[1] = "Matt";
    std::cout << names.size();
    passit(names);             
}

否则,您可以对现有代码执行中间修复。

正如您所发现的,当您尝试通过值传递数组时,它实际上会衰减为指针(在本例中为char(*)[256]),并且您会丢失有关第一个维度大小的所有信息。

通过引用传递数组避免了这种情况,除了你现在必须指定完整的数组类型,包括所有数组维度;然后,模板参数推导使此操作自动执行:

template <size_t N>
void passit(char (&names)[N][256]) {
    printf("%dn", N);
}