我是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)
如果你真的想要传递一个数组,那么通过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.
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)