我决定通过学习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