const char* 在哪里获得指向内存地址的指针?
Posted
技术标签:
【中文标题】const char* 在哪里获得指向内存地址的指针?【英文标题】:Where does const char* get the pointer to a memory address? 【发布时间】:2020-07-31 19:15:57 【问题描述】:这可能是一个简单的问题,但为什么 const char* 不需要指向内存地址?
例子:
const char* a = "Anthony";
而不是:
const char *a = // Address to const char
和其他类型一样吗?
【问题讨论】:
是什么让你认为字符串文字没有内存地址? 同意。我不希望有人问这个问题甚至知道value categories 的存在,更不用说他们有名字了。 请不要问带有 C 和 C++ 标记的问题。正如我们所观察到的,答案现在是 C++ 特定的,并且 cmets 再次偏离了两种语言之间的差异。到目前为止,存在如此多的差异,以至于很难提出一个实际上对两种语言都有相同有效答案的问题。请在询问之前确定您要使用的语言。 【参考方案1】:你可以想象这个声明
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 )
【讨论】:
【参考方案2】:为什么 const char 不需要内存地址来指向?*
确实如此。
类似
的 C 字符串文字"Anthony"
衰减到其第一个st 字符的地址。就像,顺便说一句; C 中的任何数组都可以。
【讨论】:
更具体地说,它是const char[8]
类型(在 C++ 中,可能是 char [8]
在 C 中,不确定),并且像所有内置数组一样,当将其用作值时,它会衰减为指向其第一个元素的指针。
@NikosC.:感谢您提醒我在这种情况下最重要的魔术动词! ;)
感谢您的回答!我想知道它从哪里获得内存。
不能代表 C,但我很确定 C++ 没有指定必须存储字符串文字的位置。刚去挖。如果有一个规则,它就被埋在一个奇怪的地方,并且远离任何提及“字符串文字”。
@NikosC。 char [8]
在 C 中:c-faq.com/ansi/strlitnotconst.html【参考方案3】:
它确实需要一个内存地址,而且它有一个内存地址。在您的示例中,它只是字符串开头的内存地址。这与在编译时初始化的任何其他数组变量相同,例如“int array [] = 0, 1, 2, 3;”。
如果您使用二进制编辑器查看可执行文件,您会在其中看到字符串“Anthony”。如果您输入“printf ("a is at %p\n", (void *)a);”行在你的程序中,然后编译并运行它,你会看到地址。
【讨论】:
【参考方案4】:“为什么
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!"
的第一个元素的地址分配,该地址可以根据执行环境存储在内存中的任何位置。
在程序员的能力范围内,字符串文字被精确存储。您的任务只是适当地分配和处理相应的指针。
【讨论】:
以上是关于const char* 在哪里获得指向内存地址的指针?的主要内容,如果未能解决你的问题,请参考以下文章
const char* a 与 char* const b 的区别