为什么指针a的值改变时指针b的值不变

时间:2021-05-23 18:49:13

标签: c

这是一个示例 c 代码:

#include <stdio.h>

int main()
{

    char *a = "something";
    char *b;
    b = a;
    a = "example";
    printf("%s", b);

    return 0;
}

现在,为什么 b 的值仍然是“某物”?

不应该改变吗?

2 个答案:

答案 0 :(得分:4)

起初:即使在 C 中是合法的,您也不应该将字符串文字分配给 char*,这很容易导致意外修改文字,从而引发未定义的行为。确保只分配给 char const* 以避免出现问题(最近在 C++ 中强制要求 - 有充分的理由)。

然后一步一步:

a = "something" – 内存中某处有一个 char 数组,它包含字符串的九个字符加上一个终止的空字符。 a 被分配了这个数组的地址(这实际上是一个指针,只是某个对象的内存地址)。

b = a 复制 ab。由于两者都是指针,只复制地址。字符串本身保持不变。

a = "example" – 内存中有一个数组,包含以空字符结尾的字符串。只分配了 ab 保持不变——因此将继续包含第一个字符串的地址。相比之下,a 接收第二个字符串的地址。

用铅笔在纸上干画:ab,例如。 G。在一个圆圈中,代表指针和两个字符串。通过在文本 "something" 上绘制箭头来完成分配。由于 b 复制 aab 现在都应该指向 "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 中的值而不是地址。