gpt4 book ai didi

c++ - C++ 中 char[] 到 char* 的隐式转换

转载 作者:太空狗 更新时间:2023-10-29 20:21:34 26 4
gpt4 key购买 nike

char[] 的大小是char 的数量乘以 sizeof(char)char* 的大小是 sizeof(pointer) - 指向第一个元素的指针。

sizeof(char[]) 在声明它的 main() 中打印 number of char times sizeof(char),但如果我将这个数组传递给函数,它函数将 char[] 转换为 char* 并且不可能使用 sizeof() 获取数组的大小,

"void pr(char chr[])" is changed to "void pr(char chr*)"

代码示例:

using namespace std;
void pr(char chr[])
{
std::cout << "in pr(): " << sizeof(chr)<<"\n";
}
int main()
{
char* c;
char z[] = { 1,2,3,4,5,6,7,8,9};
c = z;
std::cout << "sizeof char* c in main(): " << sizeof(c) << "\n";
std::cout << "sizeof char* c "; pr(c); std::cout << "\n";
std::cout << "sizeof char z[] in main(): " << sizeof(z) << "\n";
std::cout << "sizeof char z[] "; pr(z); std::cout << "\n";

getchar();
return 0;
}

输出:

sizeof char* c in main(): 4 // pointer size
sizeof char* c in pr(): 4 // pointer size

sizeof char z[] in main(): 9 // elements*sizeof(char)
sizeof char z[] in pr(): 4 // pointer s

此行为是标准化的还是基于其实现的?

最佳答案

这是标准行为,因为涉及函数调用并且 [dcl.fct]/5 说:

The type of each parameter (including function parameter packs) is determined from its own decl-specifier-seq and declarator. After determining the type of each parameter, any parameter of type “array of T” or of function type T is adjusted to be “pointer to T”.

因此您正在打印 char* 的大小。

改用引用:

void pr(char (&chr)[9])
{
std::cout << "in pr(): " << sizeof(chr)<<"\n";
}

在你的第二种情况下会再次输出 9

如果您对数组的大小感兴趣,其他建议:

  • 使用std::array或另一个容器(首选并且先阅读文档以避免像浪费堆栈空间这样的陷阱)
  • 传递一个指针和数组的大小

关于c++ - C++ 中 char[] 到 char* 的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43224984/

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