[英]Understanding Array of Character String Pointers
我正在嘗試理解引用指針“ p”時收到的結果。 我已在線發表評論,說明我所相信的正在發生的事情。
#include <stdio.h>
main()
{
char *words[] = { "hello", "world" };
char **p = words; // p is now pointing to words[0]?
++p; // p now points to "world"
printf("%s\n", *p); // Prints the character string 'world', pointed to by p
printf("%c\n", *p[0]); // Returns 'w'
printf("%c\n", *p[1]); // Should return 'o'? Returns garbage
printf("%c\n", *++p[0]); // Returns 'o'?
}
我的理解是:
char **p = words;
現在, p指向單詞[0]指向的第一個字符,即'hello'中的'h ' 。 然后:
++p
p現在指向單詞[1]上指針所指向的第一個字符,即'world'中的'w ' 。
結果:
world
w
<blank space>
o
如果* p [0]返回字符'w'。 那么,* p [1]為什么返回垃圾? 我試圖了解* words中的指針所指向的內容是如何在內存中組織的,然后在每次調用后p指向何處。
更新資料
通過更改以下行:
printf("%d\n", *p[0]);
printf("%d\n", *p[1]);
printf("%d\n", *++p[0]);
現在的結果是:
119 // 'w'
1 // 'SOH' -- Start of heading
111 // 'o'
現在,在這種情況下,SOH字符到底是什么?
有一些誤會。
之后的內存布局:
char *words[] = { "hello", "world" };
看起來像:
words[0] words[1]
| |
v v
+-----------+-----------+
| ptr1 | ptr2 |
+-----------+-----------+
ptr1
+---+---+---+---+---+------+
| h | e | l | l | o | '\0' |
+---+---+---+---+---+------+
ptr2
+---+---+---+---+---+------+
| w | o | r | l | d | '\0' |
+---+---+---+---+---+------+
你說:
char **p = words; // p is now pointing to world[0]?
如果您的意思是words[0]
,那么您是正確的。
你也說過
現在,
p
指向words[0]
指向的第一個字符
那是不對的。 p
的類型為char**
。 您可以說*p
指向words[0]
指向的第一個字符。
關於程序的輸出...
您有一行:
++p;
這條線改變p
,使其指向words[1]
。
線
printf("%c\n", *p); // Should return 'w'? But returns garbage
是導致未定義行為,因為類型*p
不是int
表示一個char
。 *p
類型是char*
,而不是char
。
線
printf("%c\n", *p[0]); // Returns 'w'
打印w
因為p[0]
等於ptr2
。 從內存布局可以看到, *ptr2
計算結果為'w'
。 因此,您在輸出中得到w
。
線
printf("%c\n", *p[1]); // Should return 'o'? Returns garbage
也是導致行為不確定的原因。
由於運算符優先級, *p[1]
等效於*(p[1])
,等效於*(*(p+1))
。 因為p
已經指向words[1]
,所以(p+1)
指向無效的內存。
您應該使用警告來顯示基本錯誤
a.c:10:5: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat]
*p
是指向char的指針。 嘗試:
printf("%s\n", *p);
printf("%c\n", *p[1]);
這里p[1]
可以是words
的第三個元素,因為沒有第三個元素可以讀取垃圾值。
對於++p[0]
p[0]
點, "world"
與++
這點"orld"
,然后用*
您打印第一char
等等o
。
要不理解指針,可以將print
與%p
配合使用以查看指向的地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.