这里有两个问题 - 了解指针的类型,以及了解可以修改的内存部分。
最新版本的 gcc 编译器对以下行发出警告:
char *mychar = "H";
虽然警告可能难以理解:
warning: deprecated conversion from string constant to ‘char*’
尽管有警告,那行代码仍然可以编译和运行。基本上,他们不鼓励你这样做—— mychar 现在是一个指针,指向内存中编译器放置两个字符“H”和“\0”的某个位置。如果您执行 mychar[3] = 'X' 之类的操作,那么您正在编写一个您一无所知且无法控制的内存区域;根据实现,这可能会导致运行时错误。如果添加 const:
const char *mychar = "H";
或
char const *mychar = "H";
警告消失了,但现在您已经清楚自己不能使用此指针来更改内存。如果你以后这样做
*mychar = 'E';
这将导致编译时错误(不是警告),因为您不能使用 const char* 来更改内存。
现在,关于你实际得到的错误信息,是因为你写了
*mychar = "E";
而不是
*mychar = 'E';
当编译器看到“E”时,它会在可执行文件中用字符“E”和“\0”留出一些内存,“E”的值是指向内存中该点的指针(char*) . *mychar 是 mychar 指向的地址处的字符。所以
*mychar = "E";
将 char* 指针指向“E”字符串,并将其放在内存中 mychar 指向的位置。您的错误消息真正令人困惑的是它指的是整数。我猜这是因为 char 可以被认为是一种整数(unsigned char 可以取 0 到 255 之间的任何值)。
您正在尝试将字符的值设置为指针的值。将指针转换为整数是合法的(虽然很少是一个好主意),所以你可以尝试
*mychar = (char)"E";
但是使用我的 gcc (4.9.3) 版本会产生编译时错误,因为强制转换会降低精度——您将采用 32 位或 64 位值并将其转换为 8 位值。同样,使用我的 gcc 版本,
*mychar = (int)"E";
编译(如果我没有将 mychar 设为 const char*),但会产生运行时错误,因为它试图更改只读内存。
也许你真正的意思是
mychar = "E";
这会将 mychar 从指向内存中包含“H”的位置更改为内存中包含“E”的位置。这可以正确编译和运行。