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

时间:2017-04-05 07:47:15

标签: c++ arrays pointers

char[]的尺寸为number of char times sizeof(char)char*的大小为sizeof(pointer) - 指向第一个元素的指针。

sizeof(char[])在声明它的number of char times sizeof(char)中打印main(),但是如果我将此数组传递给函数,它的函数会将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

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

2 个答案:

答案 0 :(得分:5)

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

  

每个参数的类型(包括   函数参数包)由其自己的decl-specifier-seq和声明符确定。确定后   每个参数的类型,“T的数组”或函数类型T的任何参数都被调整为   “指向T的指针”。

因此您要打印char*的大小。

改为使用引用:

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

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

如果您对阵列的大小感兴趣,请提供其他建议:

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

答案 1 :(得分:1)

在两种情况下(char []和char *)都将数组作为指针传递。在函数内部,无法获得有关数组的已分配内存的额外信息。您可以使用关于大小的额外参数或您自己的struct或类的typedef,也可以使用STD库。