我是不是用C中的指针变量直接将值分配给内存位置



我决定通过学习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("%sn", ptr);    // Output: "String 1"
printf("%pn", ptr);    // Output: 0000000000404003 <- one memory location
// Assign a new VALUE to the pointer variable
ptr = "String 2";
printf("%sn", ptr);    // Output: "String 2"
printf("%p", ptr);    // Output: 000000000040400F <- a new memory location
return (0);
}

我真的给指针变量引用的内存位置赋值了吗?

为什么当我给指针变量分配一个新值时,内存位置会改变?

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

*ptr = 'B';

关于这个代码片段

char *ptr;
ptr = "String 1";

则声明一个指针,该指针随后被分配有字符串文字CCD_。

你可以像一样重新分配指针

ptr = "String 2";

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

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

*ptr = 's';

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

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

char s[] = "String 1";
char *ptr = s;
*ptr = 's';

pointer保持对对象(地址(的引用。

char *ptr = "string 1";

与相同

char *ptr;
ptr = "string 1";

它将字符串文字CCD_ 7的地址分配给指针CCD_。字符串文字是以空字符结尾的const char数组。

当你:

ptr = "string 2";

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

ptr = "String 2";
printf("%sn", 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 %pn", str, (void *)str);
printf("ptr = `%s` it is holging %p address. Its address is %pn", 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

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

https://godbolt.org/z/x8PsW9vsP

最新更新