簡體   English   中英

創造兩個指針? char * name [] = {“xxx”,“yyy”}

[英]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 samename and address of "xxx" wont be the same 這里namearray 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* ,其值是數組的第一個元素的地址。 表達式&namepointer 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 arrayaddress of a pointer to an array ,它肯定是與name&name不同的值。

你能解釋一下指針“name”的地址如何與指針“name”所指向的地址相同嗎?

&name為您提供整個指針數組的地址(其中包含指向字符串XXXYYY的指針), name將為您提供指向其第一個元素的指針,即XXX (在衰減之后)。 由於第一字節的地址被認為是變量(陣列)的地址,值&name是相同的name ,但兩者的&namename是不同的類型。

根據我的理解,指針“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&nameprintf調用中的值相同,但它們的類型不同。 要看到差異,請執行以下操作:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM