在C++中隐式转换char []到char*

Per*_*kie 3 c++ arrays pointers

大小char[]number of char times sizeof(char),大小char*sizeof(pointer)- 指向第一个元素的指针.

sizeof(char[])打印number of char times sizeof(char)main(),在它的声明,但如果我通过这个数组的功能,其功能转换char[]char*和它的imposibble获得使用数组的大小sizeof(),

"void pr(char chr[])" is changed to "void pr(char chr*)"
Run Code Online (Sandbox Code Playgroud)

代码示例:

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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

这种行为是标准化的还是基于它的实现?

Mar*_* A. 5

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

每个参数的类型(包括函数参数包)由其自己的decl-specifier-seq和声明符确定.在确定每个参数的类型之后,将"T数组"或函数类型T的任何参数调整为"指向T的指针".

所以你打印的大小char*.

改为使用引用:

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

9在你的第二个案例中再次输出.

如果您对阵列的大小感兴趣,还有其他建议:

  • 使用std::array或其他容器(首选并首先阅读文档,以避免浪费堆栈空间等陷阱)
  • 传递指针和数组的大小