C++ Array Pass to Function被截断

Ale*_*x G 0 c c++ arrays

我是C/C++的新手,我正在学习数组.我刚刚读完了关于将数组传递给函数的内容,并且正在尝试实现它.我从一个数组开始x[] = "Hello,当然有一个sizeof()6.但由于某种原因,当我将它传递给我的函数时listElements(char arr[]),我得到sizeof(arr)等于4.为什么我的数组被切断了?

另外,sizeof(char)我的编译器是1.

#include <iostream>
using namespace std;

void listElements(char[]);

int main(){
    char x[] = "Hello";
    cout << sizeof(x) << endl; // 6
    listElements(x);
    cin >> x[0];
    return 0;
}

void listElements(char arr[]){
    cout << "Size of arr: " << sizeof(arr) << endl; // 4  <--- why is this 4?
    cout << "Size of char: " << sizeof(char) << endl; // 1
    for (int j = 0; j < (sizeof(arr) / sizeof(char)); j++){
        cout << arr[j] << endl;
    }
    return;
}
Run Code Online (Sandbox Code Playgroud)

vso*_*tco 7

如果你真的想要传递一个数组,那么通过const模板传递它,或者通过模板传递它(如果你不想更改它,则引用它),比如

template<std::size_t N>
void listElements(/*const*/ char (&arr)[N])
{ 
    // sizeof(arr) will be equal to N
    // rest of the function body here
}
Run Code Online (Sandbox Code Playgroud)

如果你按值传递它,那么它会衰减到一个指针,即void listElements(char arr[])void listElements(charr arr[1024])它相同void listElements(char* arr).

PS:请注意,如果您通过上面的引用传递数组,那么您的函数将不再使用指针,因为在这种情况下,编译器区分指针和数组.也就是说,listElements(p)不会编译char* p;.如果要将它与指针一起使用(这可能很方便),那么必须手动指定大小作为函数的附加参数,或者使用一些约定作为数组末尾定界符,例如以零结尾的字符串在C.


Bau*_*gen 5

char[]作为函数参数与char*C++中的相同.显然在你的系统上,sizeof(char*) == 4.而且,sizeof(char)总是等于1.

要正确传递C风格的字符串,请将其长度作为额外的整数参数传递,或者更好的是,使用std::string而不是char[]char*.

代码示例:

void listElements(char *arr, int length){
    for (int j = 0; j < length; j++){
        cout << arr[j] << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

void listElements(const std::string& str){
    for (const auto& v : str)
        std::cout << v << std::endl;
}
Run Code Online (Sandbox Code Playgroud)