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)
这种行为是标准化的还是基于它的实现?
这是标准行为,因为涉及函数调用并[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或其他容器(首选并首先阅读文档,以避免浪费堆栈空间等陷阱)| 归档时间: |
|
| 查看次数: |
504 次 |
| 最近记录: |