簡體   English   中英

了解字符串指針數組

[英]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.

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