我對 C 處理字串和char *vs的方式感到困惑char[]。
char name[10] = "asd";
printf("%p\n%p", &name, &name[0]); //0x7ffed617acd
//0x7ffed617acd
如果這段代碼為兩個引數提供了相同的地址,是否意味著 C 編譯器將 char 陣列(字串)作為指向陣列中第一個 char 的指標并在記憶體中移動直到它獲得空終止符?如果我們將 更改為char name[],為什么不會發生同樣的情況char *name?(我知道它們不同,但是什么讓 C 以不同的方式對待兩者?)
我知道不能在宣告后分配陣列(除非您使用了 strcpy、strcat 之類的東西),這也令人困惑。為什么 C 不把它們當作任何其他資料型別?(有人告訴我編譯器有一個特定的地址,而你可以分配char*到記憶體中的任何位置,因為它是一個指標)。
我知道char *有固定大小,不同的是char[]它char *不能用于strcat.
uj5u.com熱心網友回復:
在 C 中,“字串”是“char”型別的陣列(以 結尾\0)。當您在 C 中參考陣列時,您使用的是指向第一個元素的指標。在這種情況下(char *)。
根據 ANSI-C 標準,陣列的名稱是指向第一個元素的指標。
能夠寫作name而不是&name[0]語法糖。以同樣的方式訪問陣列元素 writename[i]類似于 write *(name i)。
uj5u.com熱心網友回復:
這是否意味著c編譯器將char陣列(字串)作為指向陣列中第一個char的指標
陣列不是指標。但是陣列會隱式轉換為指向第一個元素的指標。這種轉換稱為“衰減”。
...并在記憶體中移動直到它獲得空終止符???
如果您知道指標指向空終止字串的元素,則可以撰寫這樣的回圈。如果您撰寫該回圈,那么編譯器將生成一個執行此類操作的程式。
如果我們將 char name[] 更改為 char *name,為什么不會發生同樣的情況?
你的前提是錯誤的。您可以直接迭代陣列,也可以使用指標。
如果此代碼為兩個引數提供相同的地址,是否意味著
物件的地址是物件的第一個位元組。這個“相同地址”的意思是陣列的第一個元素的第一個位元組與整個陣列的第一個位元組位于相同的地址。
我知道不能在宣告后分配陣列(除非您使用了 strcpy、strcat 之類的東西),這也令人困惑。
既不strcpy也不strcat分配陣列。他們分配陣列的元素,您也可以在不呼叫這些函式的情況下進行。
為什么 C 不把它們當作任何其他資料型別?
這個問題不清楚。“C 拿走他們”是什么意思?為什么你認為 C 應該采用另一種資料型別?您認為應該采用哪種資料型別?
char name[10] = "asd"; printf("%p\n%p", &name, &name[0]);
引數分別是型別char(*)[10]和char*。的%p說明符要求變數類似于型別的格式void*,其是不相似的那些引數。傳遞非格式說明符要求的型別的引數會導致未定義的行為。你應該投其他指標型別void*使用時%p。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/321520.html
