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

问题描述 投票:6回答:3

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

示例:

const char* a = "Anthony";

而不是:

const char *a = // Address to const char

像其他类型一样吗?

c++ c implicit-conversion c-strings string-literals
3个回答
7
投票

您可以想象这个声明

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 )

3
投票

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

是。

C字符串文字,如

"Anthony"

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


0
投票

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!"的第一个元素的地址分配,可以根据执行环境将其存储在内存中的任何位置。

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

© www.soinside.com 2019 - 2024. All rights reserved.