我決定通過學習 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);
}
我真的為指標變數所參考的記憶體位置分配了一個 VALUE 嗎?
為什么當我為指標變數分配新值時記憶體位置會發生變化?
uj5u.com熱心網友回復:
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
uj5u.com熱心網友回復:
要使用指向物件的指標為物件賦值,您需要像在第一個程式中一樣取消對指標的參考。
*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';
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/393256.html
上一篇:C|在宏函式中處理多個引數
下一篇:結構不保存新值
