这可能是一个简单的问题,但是为什么const char *不需要指向内存地址?
示例:
const char* a = "Anthony";
而不是:
const char *a = // Address to const char
像其他类型一样吗?
您可以想象这个声明
const char* a = "Anthony";
以下方式
const char string_literal[] = "Anthony";
const char *a = string_literal;
也就是说,编译器将创建一个具有静态存储持续时间的字符数组,用于存储字符串"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;
}
程序输出为
The size of the referenced array is 8
Anthony
[字符串文字的大小(存储字符串文字的数组的大小)等于8
,因为字符串还包括终止的零字符'\0'
。
在演示程序中,表达式
std::extent<std::remove_reference<decltype( r )>::type>::value
可以仅替换表达式
sizeof( r )
为什么要使用const char不需要指向内存地址?*
是。
C字符串文字,如
"Anthony"
被衰减到其1 st字符的地址。就像,顺便说一句; C中的任何数组都可以。
“
const char*
为什么不需要指向内存地址的指针?”
实际上,它[[确实需要指向一个内存地址。
const char* a
表示a
是指向字符串文字或字符常量的指针。 指针
总是要求指向一个地址,因为它是指向内存中特定对象的指针的本质。因此,a
和指向const char
的任何其他指针也是如此。
"Hi My Name is Alfred!"
,其赋值如:const char* a;
a = "Hi My Name is Alfred!";
衰减指向字符串文字第一个元素的地址的指针。依次表示,
a
由字符串文字"Hi My Name is Alfred!"
的第一个元素的地址分配,可以根据执行环境将其存储在内存中的任何位置。程序员无法完全存储字符串文字。您的任务只是适当地分配和处理相应的指针。