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:我知道用其他方法怎么做,我很好奇用这种方法。
本声明
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)