为什么分配给字符串的指针不会整个操作原始字符串?

时间:2015-10-19 20:42:50

标签: c arrays pointers

示例代码为:

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共享相同的内存地址。

相比之下,使用单个值(但不是数组)执行完全相同的操作就像我期望的那样,并且原始变量中的原始值会发生变化。

6 个答案:

答案 0 :(得分:4)

在内存的其他部分指针指向。他们不包含或拥有他们指向的东西。

以下是计算机内存前后的MS绘制草图:&/ p>

pString = "please be gentle"

Pointer diagram

希望这能为您解决问题。如您所见,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);

}