Wei*_*lix 24 c c++ c-strings string-literals implicit-conversion
这可能是一个简单的问题,但为什么 const char* 不需要指向的内存地址?
例子:
const char* a = "Anthony";
Run Code Online (Sandbox Code Playgroud)
并不是:
const char *a = // Address to const char
Run Code Online (Sandbox Code Playgroud)
像其他类型一样吗?
Vla*_*cow 29
你可以想象这个声明
const char* a = "Anthony";
Run Code Online (Sandbox Code Playgroud)
以下方式
const char string_literal[] = "Anthony";
const char *a = string_literal;
Run Code Online (Sandbox Code Playgroud)
也就是说,编译器创建一个字符数组,其静态存储持续时间存储字符串"Anthony",并将数组第一个字符的地址(由于数组指示符隐式转换为指向其第一个字符的指针)分配给指针a。
这是一个演示程序,显示字符串文字是字符数组。
#include <iostream>
#include <type_traits>
decltype( auto ) f()
{
return ( "Anthony" );
}
template <size_t N>
void g( const char ( &s )[N] )
{
std::cout << s << '\n';
}
int main()
{
decltype( auto ) r = f();
std::cout << "The size of the referenced array is "
<< std::extent<std::remove_reference<decltype( r )>::type>::value
<< '\n';
g( r );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序输出是
The size of the referenced array is 8
Anthony
Run Code Online (Sandbox Code Playgroud)
字符串文字(存储字符串文字的数组)的大小等于 ,8因为字符串还包括终止零字符 ' \0'。
在演示程序中的表达式
std::extent<std::remove_reference<decltype( r )>::type>::value
Run Code Online (Sandbox Code Playgroud)
可以只替换表达式
sizeof( r )
Run Code Online (Sandbox Code Playgroud)
为什么 const char不需要指向的内存地址?*
确实如此。
一个 C 字符串文字,如
"Anthony"
Run Code Online (Sandbox Code Playgroud)
衰减到其第一个字符的地址。喜欢,顺便说一句;C 中的任何数组都可以。