如何更改字符中的第二个字母 *名称 = "exemple" ;带字符 *名称



我学习c++是为了更好地理解内存。

char *name = "example"; 
*(&name+1) = (char*)'A';
std::cout << name << std::endl;

返回示例不是eAample.

我的想法是获得'x'的内存地址并更改它。

不是const,所以我应该可以改变地址的值,对吧?

obs:我知道用别的方法怎么做,我很好奇这样做。

此声明

char *name = "example";

是无效的。在c++中,字符串字面值具有常量字符数组的类型。这意味着你必须写

const char *name = "example";

,你不能改变字符串字面值

即使在C语言中,字符串字面值具有非常量字符数组类型,您也不能更改字符串字面值。任何更改字符串字面值的尝试都会导致未定义的行为。

这个表达式

&name+1

指向指针名称之外。所以解引用指针表达式*(&name+1)会调用未定义的行为。

这个表达式(char*)'A'也没有意义。它表示您正在尝试使用字符'A'的代码值(例如在ASCII中等于65)作为内存地址。

你可以这样做

char name[] = "example"; 
*(name+1) = 'A';
std::cout << name << std::endl;

或者如果你想处理指针表达式那么不用

*(name+1) = 'A';

你可以写

*(name+1) = *"A";

这是一个基于你的想法的演示程序。第一个基于范围的for循环将由支持c++ 20的编译器编译。否则可以重写为

const char **p = name; 
for ( const auto &letter : "example")

给你。

#include <iostream>
int main()
{
const char *name[sizeof( "example" )]; 
for ( const char **p = name; const auto &letter : "example")
{
*p++ = &letter;
}
*( name + 1 ) = &"A"[0];
for ( const char **p = name; **p; ++p )
{
std::cout << **p;
}
std::cout << 'n';
} 

程序输出为

eAample

最新更新