字符串(常量)文字指针

问题描述 投票:0回答:1

我对C ++比较陌生,我一直在寻找问题的答案,但是我感到更加困惑。据我了解,字符串文字必须由“ const”指针指向,因为它们被认为是仅可读的。我也了解到指针本身不是常量(可以更改),但实际上它指向的是字符串常量,我也了解字符串本身无法修改。因此在此示例中:

const char* cstr="string";
*cstr = 'a';

我收到一个错误:“分配只读位置。”现在,如果我按如下方式定义C字符串并定义一个指向它的指针,则可以更改该字符串:

char str[7]="string";
char* cstr = str;
*cstr = 'a';
cout << cstr <<endl;

字符串将被修改(输出-> a),表示字符串的第一个元素已更改。我的两个问题是:1-为什么在第二个示例中我可以修改C字符串,但是在第一种情况下我不能对字符串进行任何更改? 2-在两种情况下我都使用指针,但在第一种情况下我应使用常量char指针?

string pointers constants c-strings literals
1个回答
0
投票

使用语法时

const char* cstr="string";

C ++定义:

  • 在内存的只读部分中包含7个字符的数组,其中的内容为“ string \ 0”。*指针在堆栈上(或在内存的可写全局部分中),带有该数组的地址。

但是,当您使用语法时:

char str[7]="string";

C ++定义:

  • 在堆栈上(或在内存的可写全局部分中)一个7个字符的数组,其中包含内容“ string \ 0”。

在第一种情况下,实际值位于只读存储器中,因此您无法更改它们。在第二种情况下,它们位于可写内存(堆栈或全局)中。

C ++试图强制执行此语义,因此,如果定义是只读内存,则应使用const指针。

请注意,并非所有体系结构都具有只读存储器,但是由于大多数体系结构都具有只读存储器,因此C ++可能想要使用只读存储器功能(以提高准确性),因此C ++程序员应假定] >(出于指针类型的目的),常量将被放置在只读存储器中。

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