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

问题描述 投票:23回答:4

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

示例:

const char* a = "Anthony";

而不是:

const char *a = // Address to const char

像其他类型一样?

c++ c implicit-conversion c-strings string-literals
4个回答
28
投票

您可以想象这个声明

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"

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


1
投票

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

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


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.