簡體   English   中英

如何用指針理解字符串

[英]How to understand strings with pointers

最近幾個月我一直在學習 C 語言。 我正在使用一本書,我有這個練習:

char vector[N_STRINGS][20] = {"ola", "antonio", "susana"};
char (*ptr)[20] = vector;
char *p;

while(ptr-vector<N_STRINGS)
{
    p = *ptr;
    while(*p)
        putchar(*p++);
    putchar('\n');
    ptr++;
}

我明白一切都期待while(*p) 我無法弄清楚while(*p)在做什么。

代碼中的變量p被定義為指向char指針 獲取p指向的實際char值,您需要使用*運算符取消引用指針。

因此, while循環中的表達式*p在每個循環開始時計算為p當前指向的char變量。 在循環內部, putchar調用也使用了這個解引用運算符,但隨后會增加指針的值,因此,在將該字符發送到輸出后,指針會增加( ++運算符),然后它指向字符串中的下一個字符。

傳統上(實際上,幾乎總是), C中的字符串是以NUL結尾的,這意味着字符串的結尾是通過在字符串末尾具有一個值為零的字符來表示的。

當代碼中的while循環到達此NUL終止符時,表達式*p的值將因此為零。 而且,由於零相當於C的邏輯“假”(任何非零值都被視為“真”), while循環將結束。

隨時要求進一步澄清和/或解釋。

來自 C 標准(6.8.5 迭代語句)

4 迭代語句會導致重復執行稱為循環體的語句,直到控制表達式比較等於 0。

在這部分程序中

p = *ptr;
while(*p)
//…

指針p指向當前字符串的第一個字符。 C 中的字符串是由零字符'\\0'終止的字符序列。

因此,讓我們舉個例子,指針最初指向字符串"ola"的第一個字符。 該字符串在相應的字符數組中表示,如

{ 'o', 'l', 'a', '\0' }

循環中的條件

while(*p)

可以重寫為

while(*p != 0 )

因此,將對字符串中除最后一個以零結尾的字符之外的所有字符執行循環,並輸出字符串的前三個字符。

注意(6.5.9 相等運算符)

3 ==(等於)和!=(不等於)運算符與關系運算符類似,只是它們的優先級較低。108)如果指定的關系為真,則每個運算符都會產生 1,如果指定的關系為假,則產生 0。 結果的類型為 int。 對於任何一對操作數,只有一個關系為真。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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