0

我决定通过学习 C 来使我的生活复杂化。目前我正在尝试完全理解指针。

到目前为止,这是我的理解:

#include <stdio.h>
int main() {

    char var = 'A';
    // Iniialize a pointer variable to the ADDRESS of variable "var"
    char *ptr = &var;
    printf("%c", var);    // Output: 'A'

    // Change the VALUE at the memory location of variable "var"
    *ptr = 'B';
    printf("%c", var);    // Output: 'B'

    return (0);
}

但是后来我正在考虑将一个字符串重新分配给一个变量,并遇到了这篇文章,其中一个指针变量被直接赋值。

这就是我想要理解的:

#include <stdio.h>
int main() {

    // Declare a pointer variable
    char *ptr;

    // Assign a VALUE directly to a memory location???
    ptr = "String 1";
    printf("%s", ptr);    // Output: "String 1"

    return (0);
}

此外,如果我为 分配一个新的字符串值ptr,例如ptr = "String 2";,并在每次分配后输出内存位置,我会得到一个不同的内存位置:

#include <stdio.h>
int main() {

    // Declare a pointer variable
    char *ptr;

    // Assign a VALUE directly to a memory location???
    ptr = "String 1";
    printf("%s\n", ptr);    // Output: "String 1"
    printf("%p\n", ptr);    // Output: 0000000000404003 <- one memory location

    // Assign a new VALUE to the pointer variable
    ptr = "String 2";
    printf("%s\n", ptr);    // Output: "String 2"
    printf("%p", ptr);    // Output: 000000000040400F <- a new memory location

    return (0);
}

我真的为指针变量引用的内存位置分配了一个值吗?

为什么当我为指针变量分配新值时内存位置会发生变化?

4

2 回答 2

2

pointer持有对对象(地址)的引用。

char *ptr = "string 1";

是相同的

char *ptr;
ptr = "string 1";

它用字符串字面ptr量的地址分配指针。字符串文字是空字符终止的数组。 "string 1"const char

当你 :

ptr = "string 2";

您将指针分配给ptr另一个字符串文字的地址。正如我上面所写的,它只是一个const char数组。两个字符串文字的地址不同。

ptr = "String 2";
printf("%s\n", ptr);    // Output: "String 1"

这是不可能的,并且您在此处发布的代码与您在计算机上运行的代码不同。它肯定打印出来String 2

// Assign a VALUE directly to a memory location???
ptr = "String 1";

不,此分配仅分配指针ptr与驻留在内存中某处的字符串文字的地址。它不会在任何地方分配空间或复制此字符串。

魔法*

当您使用解引用运算符时*,您可以访问指针所引用的对象。

char str[] = "String 1";
char *ptr;

ptr = str;
*ptr = 'X';

printf("str = `%s` And its address is %p\n", str, (void *)str);
printf("ptr = `%s` it is holging %p address. Its address is %p\n", ptr, (void *)ptr, (void *)&ptr);

输出:

str = `Xtring 1` And its address is 0x7ffdc9047827
ptr = `Xtring 1` it is holging 0x7ffdc9047827 address. Its address is 0x7ffdc9047818

如您所见,它更改了stras 指针的第一个字符,该指针ptr保存了该数组第一个字符的地址。

https://godbolt.org/z/x8PsW9vsP

于 2021-12-25T17:38:24.443 回答
2

要使用指向对象的指针为对象分配值,您需要像在第一个程序中所做的那样取消引用该指针。

*ptr = 'B';

至于这个代码片段

char *ptr;

ptr = "String 1";

然后声明一个指针,然后为该指针分配字符串文字的第一个字符的地址"String 1"

您可以重新分配指针,如

ptr = "String 2";

但这会重新分配指针本身,而不是指针先前指向的对象。现在,指针指向字符串字面量的第一个字符"String 2"

请注意,您可能不会使用指针更改字符串文字,例如

*ptr = 's';

任何更改字符串文字的尝试都会导致未定义的行为。

但是您可以更改由字符串文字初始化的字符数组,例如

char s[] = "String 1";
char *ptr = s;
*ptr = 's';
于 2021-12-25T17:44:07.443 回答