这是一个示例 c 代码:
#include <stdio.h>
int main()
{
char *a = "something";
char *b;
b = a;
a = "example";
printf("%s", b);
return 0;
}
现在,为什么 b
的值仍然是“某物”?
不应该改变吗?
答案 0 :(得分:4)
起初:即使在 C 中是合法的,您也不应该将字符串文字分配给 char*
,这很容易导致意外修改文字,从而引发未定义的行为。确保只分配给 char const*
以避免出现问题(最近在 C++ 中强制要求 - 有充分的理由)。
然后一步一步:
a = "something"
– 内存中某处有一个 char
数组,它包含字符串的九个字符加上一个终止的空字符。 a
被分配了这个数组的地址(这实际上是一个指针,只是某个对象的内存地址)。
b = a
复制 a
到 b
。由于两者都是指针,只复制地址。字符串本身保持不变。
a = "example"
– 内存中有一个数组,包含以空字符结尾的字符串。只分配了 a
,b
保持不变——因此将继续包含第一个字符串的地址。相比之下,a
接收第二个字符串的地址。
用铅笔在纸上干画:a
和b
,例如。 G。在一个圆圈中,代表指针和两个字符串。通过在文本 "something"
上绘制箭头来完成分配。由于 b
复制 a
,a
和 b
现在都应该指向 "something"
。
现在通过蚀刻其箭头并重新绘制它来重新分配 a
,指向 "example"
- b
(仍然)指向哪里?
如果你修改数组本身,整个事情就会改变(同样:不要修改文字本身!):
char text[] = "something";
// ^^ note: array; it is initialized by copying the string literal into,
// size will be the size of the literal
char* a = text;
char* b = text;
// modify the array:
*a = 'S';
// ^ note: dereferencing the pointer, i. e. modify what a points to!
printf("%s", b); // prints 'Something' as b still points to the same memory location as a
答案 1 :(得分:0)
b=a;表示 b 指向 a 指向的地址。 如果代码是:
int main()
{
char *a = "something";
char *b;
a = "example";
b = a;
printf("%s", b);
return 0;
}
输出将是 "example"
;
如果代码是:
int main()
{
char *a = "something";
char **b;
b = &a;
a = "example";
printf("%s", *b);
return 0;
}
输出将是 "example"
,因为在这种情况下 b 总是指向 a 中的值而不是地址。