我是一個試圖改進 C 中指標的菜鳥。我已經宣告了一個指向 ptr 變數 strarray 的 ptr,動態分配記憶體,甚至沒有對 (char *) 進行型別轉換,并將一個字串分配給 ptr 到 ptr 變數而不是指標,但是程式給出輸出“dddd”它是如何作業的
//array of string
#include<stdio.h>
#include<stdlib.h>
void main(){
char **strarray;
int arraylengh=10;
strarray = malloc(sizeof(char *) * arraylengh);
strarray[4]="ddddd";
printf("%s ", strarray[4]);
}
strarray 是指向指標變數的指標,我將字串直接分配給它 strarray[4]="ddddd"; strarray[4] 應該分配給指向字串的指標,對嗎?我可以看到 ddddd 作為輸出
uj5u.com熱心網友回復:
我發現用圖片最容易理解這些情況。當你的程式完成時,它已經設定了指標到指標的變數strarray,它看起來像這樣:
---------
strarray: | * |
----|----
|
|
v
---------
| ????? |
---------
| ????? |
---------
| ????? |
---------
| ????? |
--------- --- --- --- --- --- ----
| *-----------> | d | d | d | d | d | \0 |
--------- --- --- --- --- --- ----
| ????? |
---------
| ????? |
---------
| ????? |
---------
| ????? |
---------
| ????? |
---------
當您呼叫 時malloc,您會得到一個適合包含 10 個指標的未命名記憶體塊。您分配strarray指向該記憶體塊,它的行為非常像一個陣列,它也可能是一個。您將該“陣列”的第五個元素設定為指向字串"ddddd"。其他 9 個指標仍不確定,此處用 表示?????。
編譯器會自動為您分配字串"ddddd",并且當您說時您成功地操作了指向該字串的指標
strarray[4] = "ddddd";
uj5u.com熱心網友回復:
您不是復制"ddddd"到strarray[4],而是將指標復制到"ddddd"。
C 中的所有字串都是指標,包括"ddddd"(技術上是一個“降級”為指標的陣列)。strarray[4]="ddddd"不是復制"ddddd",而是分配一個指標。
char *str = "ddddd";
strarray[4] = str;
一樣。
我們可以將它們列印為指標,以查看它們指向同一事物。
printf("%p %p\n", strarray[4], str);
uj5u.com熱心網友回復:
strarray = malloc(sizeof(char *) * arraylengh);
在這里,您為char *指標陣列分配記憶體。
下面的可視化顯示了它在記憶體中的樣子:
strarray -> ptr1 | ptr2 | ptr3 | ptr4...
strarray 是指向指標變數的指標,我將字串直接分配給它 strarray[4]="ddddd"; strarray[4] 應該分配給指向字串的指標,對嗎?我可以看到 ddddd 作為輸出
分配一個字串strarray[4]是完全有效的。由于陣列由指標組成,因此您也可以自由地將任何指標從strarray[0]to分配給strarray[9]字串。
在以下行:
strarray[4]="ddddd
您將這些指標之一分配給一個字串。這本質上char *與使用字串分配指標相同,例如:
char *a_string = "ddddd";
但唯一的區別是這strarray[4]是您分配的指標陣列的一部分。
之所以可行,是因為字串"ddddd"是代碼中的指標。
在 C 中,字串是以 NULL 結尾的字符陣列。因此,當我們參考組成 string 的字符陣列時"ddddd",它將隱式衰減為指向陣列第一個元素的指標。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506493.html
上一篇:在Go中處理指向nil指標的指標
下一篇:為什么地址不一樣?
