示例代码为:
void main()
{
char stringy[] = "I am so dumb what is wrong with me";
char *pStringy = stringy;
pStringy = "please be gentle";
printf("%s", stringy);
}
输出是:
I am so dumb what is wrong with me
(这可能是非常基本的,但我不明白,也找不到问题(可能是因为我只是不知道该怎么说))
我想知道为什么在初始化pStringy之后输出不是“请温柔” - pStringy和stringy共享相同的内存地址。
相比之下,使用单个值(但不是数组)执行完全相同的操作就像我期望的那样,并且原始变量中的原始值会发生变化。
答案 0 :(得分:4)
在内存的其他部分指针指向。他们不包含或拥有他们指向的东西。
以下是计算机内存前后的MS绘制草图:&/ p>
pString = "please be gentle"
希望这能为您解决问题。如您所见,stringy
保持不变。
答案 1 :(得分:2)
因为您打印 stringy 而不是pStringy。 无论如何试试这个:
#include<stdio.h>
int main(void) {
char stringy[] = "I am so dumb what is wrong with me";
char *pStringy = stringy;
pStringy = "please be gentle";
printf("%s\n%s",stringy, pStringy);
return 0;
}
输出:
I am so dumb what is wrong with me please be gentle
你应该知道main应该至少 int main(void){}
编辑:
有些事情你必须要解决。
1)pString指向stringy。
2)后一个pString指向另一个内存位置(只读)。
3)所以此时pStringy不再指向 stringy ,这意味着,没有像你预期的那样修改过的数组。
答案 2 :(得分:1)
char stringy[] = "I am so dumb what is wrong with me";
char *pStringy = stringy; //pStringy point to stringy array
pStringy = "please be gentle";// instead of writing to stringy
// trough the pointer pStringy
// you assigned pStringy a new address
// of the string "please be gentle"
printf("%s\n",stringy); //printf will still print the old value
// "I am so dumb what is wrong with me"
// the proper way was to copy that string
// to the pointer using strcpy
// as so:
pStringy = stringy;
strcpy(pStringy , "please be gentle");
// now printf will print "please be gentle"
// instead of the old value
// "I am so dumb what is wrong with me"
printf("%s\n",stringy);
;
答案 3 :(得分:0)
这是你的编译器所做的。
<德尔> char *pStringy = stringy;
德尔>
pStringy = "please be gentle";
指定一个指向值的指针,然后将相同的指针指定给另一个值,总是屈服于指定的最后一个值。
答案 4 :(得分:0)
您将pStringy
设置为指向带有
char *pStringy = stringy;
然后用另一条消息覆盖该指针
pStringy = "please be gentle";
但你完全忽略了这一点,并用
打印原始邮件printf("%s", stringy);
所以打印
I am so dumb what is wrong with me
答案 5 :(得分:0)
在C数组和指针非常相似(这不完全正确,因为存在一些非常小且不明显的差异)。当你写
char stringy[] = "I am so dumb what is wrong with me";
你可以通过写
获得相同的结果char * stringy = "I am so dumb what is wrong with me";
进行作业时
char *pStringy = stringy;
两个指针指向相同的数据。如果它不是字符串文字,你就可以像这样修改它们。
pStringy[3] = 'f';
但你不能,因为它们实际上是字符串文字。
编辑:你可以做到这一点,我的C知识越来越差
真正的问题是你将指针分配给其他东西,所以它现在指向一个完全不同的值。您可以使用以下代码对此进行测试:
void main()
{
char stringy[] = "I am so dumb what is wrong with me";
char *pStringy = stringy;
//print the addresses before assigning pStringy
printf("%d\n%d\n", stringy, pStringy);
pStringy = "please be gentle";
printf("%s\n%s\n", stringy, pStringy);
//print the addresses after assigning pStringy
printf("%d\n%d\n", stringy, pStringy);
}