为什么const char *不需要指向内存地址的指针?


18

这可能是一个简单的问题,但是为什么const char *不需要指向内存地址呢?

例:

const char* a = "Anthony";

并不是:

const char *a = // Address to const char

像其他类型的一样吗?


8
是什么让您认为字符串文字没有内存地址?
user207421

2
同意 我不希望有人问这个问题,甚至不知道存在价值类别,更不用说他们有名字了。
user4581301

13
请不要问带有C和C ++标签的问题。如我们所见,答案现在是C ++特定的,并且注释又因两种语言之间的差异而脱轨。到目前为止,两者之间的差异如此之大,以至于很难问出一个实际上对两种语言都具有相同有效答案的问题。请在询问之前确定您要使用的语言。
larkey

Answers:


26

你可以想像这个宣言

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 )

5

为什么const char不需要指向的内存地址?*

是的

C字符串文字如

"Anthony"

被衰减到其第一个字符的地址。就像,顺便说一句;C中的任何数组都可以。


更具体地说,它是类型const char[8](在C ++中可能是char [8]C,不确定),并且像所有内置数组一样,当将其用作值时,它会衰减到指向其第一个元素的指针。
Nikos C.

@NikosC .:感谢您让我想起在这种情况下最重要的魔术动词!;)

感谢您的回答!我想知道它从哪里得到内存。
Weidelix

1
不能代表C,但是我很确定C ++没有指定必须在哪里存储字符串。刚去挖。如果有规则,它会被埋在一个奇怪的地方,并且与任何提及“字符串文字”的地方都相距甚远。
user4581301

2
@NikosC。char [8]在C中:c-faq.com/ansi/strlitnotconst.html
David Ranieri,

1

它确实需要一个内存地址,并且具有一个内存地址。在您的示例中,它只是字符串开头的内存地址。与在编译时初始化的任何其他数组变量相同,例如“ int array [] = {0,1,2,3};”。

如果使用二进制编辑器查看可执行文件,则会在其中看到字符串“ Anthony”。如果将行“ printf(“ a位于%p \ n”,(void *)a)放在行中;“ 在程序中,然后编译并运行它,您将看到地址。


0

“为什么const char*不需要指向内存地址的指针?”

实际上,它确实需要指向一个内存地址。

const char* aMean a是指向字符串文字或字符常量的指针。

指针始终需要指向一个地址,因为它是指向内存中特定对象的指针的本质。因此,a以及其他任何指向const char它的也是如此。

字符串文字,例如"Hi My Name is Alfred!"分配:

const char* a;
a = "Hi My Name is Alfred!";

衰减到指向字符串文字第一个元素地址的指针。

依次a由字符串文字的第一个元素的地址分配,该地址"Hi My Name is Alfred!"可以根据执行环境存储在内存中的任何位置。

程序员无法完全存储字符串文字。您的分配只是适当地分配和处理各个指针。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.