如何更改 char *name = "exemple"; 中的第二个字母 与 char *name

Vit*_*ira 0 c++ pointers c-strings char string-literals

我正在学习 C++ 以更好地理解内存。

char *name = "example"; 

*(&name+1) = (char*)'A';

std::cout << name << std::endl;
Run Code Online (Sandbox Code Playgroud)

返回示例而不是eAample

我的想法是获取“x”的内存地址并更改它。

不是 const 所以我应该能够改变地址的值对吗?

obs:我知道用其他方法怎么做,我很好奇用这种方法。

Vla*_*cow 5

本声明

char *name = "example";
Run Code Online (Sandbox Code Playgroud)

是无效的。

在 C++ 中,字符串文字具有常量字符数组类型。这意味着你必须写

const char *name = "example";
Run Code Online (Sandbox Code Playgroud)

并且您不能更改字符串文字。

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

这个表情

&name+1
Run Code Online (Sandbox Code Playgroud)

指向指针名称之外的点。因此取消引用指针表达式*(&name+1)会调用未定义的行为。

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

您可以执行以下操作

char name[] = "example"; 

*(name+1) = 'A';

std::cout << name << std::endl;
Run Code Online (Sandbox Code Playgroud)

或者,如果您想处理指针表达式,那么而不是

*(name+1) = 'A';
Run Code Online (Sandbox Code Playgroud)

你可以写

*(name+1) = *"A";
Run Code Online (Sandbox Code Playgroud)

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

const char **p = name; 
for ( const auto &letter : "example")
Run Code Online (Sandbox Code Playgroud)

给你。

#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';
} 
Run Code Online (Sandbox Code Playgroud)

程序输出是

eAample
Run Code Online (Sandbox Code Playgroud)