我学习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