这可能是一个简单的问题,但是为什么const char *不需要指向内存地址呢?
例:
const char* a = "Anthony";
并不是:
const char *a = // Address to const char
像其他类型的一样吗?
这可能是一个简单的问题,但是为什么const char *不需要指向内存地址呢?
例:
const char* a = "Anthony";
并不是:
const char *a = // Address to const char
像其他类型的一样吗?
Answers:
你可以想像这个宣言
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"
被衰减到其第一个字符的地址。就像,顺便说一句;C中的任何数组都可以。
const char[8]
(在C ++中可能是char [8]
C,不确定),并且像所有内置数组一样,当将其用作值时,它会衰减到指向其第一个元素的指针。
char [8]
在C中:c-faq.com/ansi/strlitnotconst.html
“为什么
const char*
不需要指向内存地址的指针?”
实际上,它确实需要指向一个内存地址。
const char* a
Mean a
是指向字符串文字或字符常量的指针。
指针始终需要指向一个地址,因为它是指向内存中特定对象的指针的本质。因此,a
以及其他任何指向const char
它的也是如此。
字符串文字,例如"Hi My Name is Alfred!"
分配:
const char* a;
a = "Hi My Name is Alfred!";
衰减到指向字符串文字第一个元素地址的指针。
依次a
由字符串文字的第一个元素的地址分配,该地址"Hi My Name is Alfred!"
可以根据执行环境存储在内存中的任何位置。
程序员无法完全存储字符串文字。您的分配只是适当地分配和处理各个指针。