gpt4 book ai didi

C++数组传递给函数被切断

转载 作者:太空宇宙 更新时间:2023-11-04 05:02:34 24 4
gpt4 key购买 nike

我是 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;
}

最佳答案

如果你真的想传递一个数组,然后通过模板通过引用传递它(或者 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
}

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

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

关于C++数组传递给函数被切断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28844191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com