const char* 在哪里获得指向内存地址的指针?

Wei*_*lix 24 c c++ c-strings string-literals implicit-conversion

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

例子:

const char* a = "Anthony";
Run Code Online (Sandbox Code Playgroud)

并不是:

const char *a = // Address to const char
Run Code Online (Sandbox Code Playgroud)

像其他类型一样吗?

Vla*_*cow 29

你可以想象这个声明

const char* a = "Anthony";
Run Code Online (Sandbox Code Playgroud)

以下方式

const char string_literal[] = "Anthony";

const char *a = string_literal;
Run Code Online (Sandbox Code Playgroud)

也就是说,编译器创建一个字符数组,其静态存储持续时间存储字符串"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;
}
Run Code Online (Sandbox Code Playgroud)

程序输出是

The size of the referenced array is 8
Anthony
Run Code Online (Sandbox Code Playgroud)

字符串文字(存储字符串文字的数组)的大小等于 ,8因为字符串还包括终止零字符 ' \0'

在演示程序中的表达式

std::extent<std::remove_reference<decltype( r )>::type>::value
Run Code Online (Sandbox Code Playgroud)

可以只替换表达式

sizeof( r )
Run Code Online (Sandbox Code Playgroud)


alk*_*alk 5

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

确实如此。

一个 C 字符串文字,如

"Anthony"
Run Code Online (Sandbox Code Playgroud)

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

  • @NikosC。C 中的“char [8]”:http://c-faq.com/ansi/strlitnotconst.html (2认同)