![](/img/trans.png)
[英]How to understand string variables? Are they strings and pointers simultaneously?
[英]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.