[英]Creates two pointers? char *name[] = {“xxx”, “yyy”}
有人告訴我作為我上一個問題的答案
char *name[] = {"xxx", "yyy"}
由編譯器更改為
char *name[] = {Some_Pointer, Some_Other_Pointer};
我嘗試了以下內容來理解:
printf("%p\n", &name);
printf("%p\n", name);
printf("%s\n", *name);
printf("%c\n", **name);
所以作為輸出它給了我:
0xfff0000f0
0xfff0000f0
xxx
x
你能解釋一下指針“name”的地址如何與指針“name”所指向的地址相同嗎? 根據我的理解,指針“name”本身占用8個字節。 如何在內存中占用4個字節的第一個字符串“xxx”與指針位於同一位置?
首先,當你有一個像任何數組name
在C,數組的值是它的第一個元素的地址。 請注意,此值不存儲在某個變量中。 它在編譯的匯編代碼中用作立即值。 所以考慮它的地址是沒有意義的。
其次,由於數組作為一堆連續位置存儲在存儲器中,所以數組的地址定義為第一個元素的地址。 因此,對於任何數組A
您都具有以下相同的地址
&(A[0]) == A == &A
如果你有指針數組或其他什么,它不會改變任何東西。
要查看“xxx”的地址,您應該打印printf("%p\\n", name[0]);
像這樣。 當然地址name and address of "xxx" wont be the same
的name and address of "xxx" wont be the same
。 這里name
是array of pointer
其中包含“xxx和yyy”的地址。
printf("%p\n", &name);
printf("%p\n", name);
printf("%p\n", name[0]); address of "xxx"
printf("%p\n", name[1]); address of "yyy"
name
的類型從array of char*
衰減到pointer to char*
array of char*
的pointer to char*
,其值是數組的第一個元素的地址。 表達式&name
是pointer to char* [2]
的類型pointer to char* [2]
,它的值是數組的地址,它與數組的第一個元素的地址相同。
你似乎誤解了C中數組的表示。沒有一個“meta”對象表示C中的數組.C中的數組只包含其序列中的元素。 因此,應用operator和數組名稱只會獲得數組的第一個元素的地址(按值,而不是按類型)。
如果你試着寫:
char (*p)[2] = &name;
printf("%p", &p);
這將打印出address of a pointer to an array
的address of a pointer to an array
,它肯定是與name
和&name
不同的值。
你能解釋一下指針“name”的地址如何與指針“name”所指向的地址相同嗎?
&name
為您提供整個指針數組的地址(其中包含指向字符串XXX
和YYY
的指針), name
將為您提供指向其第一個元素的指針,即XXX
(在衰減之后)。 由於第一字節的地址被認為是變量(陣列)的地址,值&name
是相同的name
,但兩者的&name
和name
是不同的類型。
根據我的理解,指針“name”本身占用8個字節。 如何在內存中占用4個字節的第一個字符串“xxx”與指針位於同一位置?
那是因為name
是一個數組,而不是一個指針。 指針是存儲相同類型的另一個變量的地址的變量,但是數組是綁定到(由單個標識符引用)的連續內存塊。 基本上,它是一種不同的類型。 請注意,數組不是C中的第一類對象 - 您無法將數組傳遞給函數或從函數返回數組。
由於數組在許多情況下衰變(隱式轉換)為指向其第一個元素的指針,因此產生混淆。 發生這種情況的一些情況是:
void f(char p[]); // p is a pointer, not an array
// This is exactly the same as
void f(char *p);
char s[] = {'h', 'e', 'l', 'l', 'o'};
f(s); // here s decays to a pointer to its first element
// another example
char t = "hello"[1]; // the string literal decays to a pointer to its first element
以下是數組保持數組(不會衰減為指針)的一些情況:
char s[] = "hello";
char *t = "hello"; // string literal decays into a pointer
printf("%d", sizeof s); // prints 5
printf("%d", sizeof t); // prints 4 or 8 depending on the pointer size on the machine
printf("%d", sizeof *t); // prints 1
// taking your example
char *name[] = {"xxxx", "yyyy"}; // yet another case where string literals decay to a pointer
printf("%p", name); // name is an array but here decays to a pointer
printf("%p", &name); // &name is a pointer to an array of 2 pointers to characters
雖然name
, &name
在printf
調用中的值相同,但它們的類型不同。 要看到差異,請執行以下操作:
printf("%p", name + 1);
printf("%p", &name + 1);
printf("%d", *(&name + 1) - name); // prints the length of the array
總而言之,數組和指針是不同的類型。 指針存儲地址,數組存儲它們被定義為存儲的類型的值。 在某些情況下,數組會計算其第一個元素的地址。 這就是數組和指針之間的相似性結束的地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.