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用法小结

const char* a 与 char* const b 的区别

为啥 const QString& 参数返回错误的 const char* 指向数据的指针

const char*转char*怎么转?

qt 中能不能用一个指向数组的指针对另一个数组赋值

C++CString转换为const char *类型