首页 > 解决方案 > const char* 在哪里获得指向内存地址的指针?

问题描述

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

例子:

const char* a = "Anthony";

并不是:

const char *a = // Address to const char

像其他类型一样吗?

标签: c++cimplicit-conversionc-stringsstring-literals

解决方案


你可以想象这个声明

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 )

推荐阅读