我剛開始學習C,我想知道......是否使用迭代字串
char *str = "Hello";
while (*str)
{
str ;
}
如同
char *str = "Hello";
int i = 0;
while (str[i] != '\0')
{
i ;
}
uj5u.com熱心網友回復:
根據 C 標準(6.5.2.1 陣列下標)
2 后綴運算式后跟方括號 [] 中的運算式是陣列物件元素的下標名稱。下標運算子[]的定義是E1[E2]等同于(*((E1) (E2)))。由于適用于二元 運算子的轉換規則,如果 E1 是陣列物件(等效地,指向陣列物件的初始元素的指標)并且 E2 是整數,則 E1[E2] 指定第 E2 個元素E1(從零開始計數)。
所以運算式*str
等價于str[0]
。Orstr[1]
是等價的 tp *( str 1 )
,而 tp 又等價于*( str 0 )
or* str
或運算式的組合 str
和*str
唯一本質的區別是在這個回圈之后
char *str = "Hello";
while (*str)
{
str ;
}
指標str
不指向字串文字的開頭"Hello"
。在第二個代碼片段中
char *str = "Hello";
int i = 0;
while (str[i] != '\0')
{
i ;
}
指標str
不變,指向字串文字的第一個字符。
請注意,與其將變數宣告i
為有符號型別int
,不如將其宣告為具有型別size_t
,因為通常該型別的物件int
可能不夠大,無法存盤所有可能長度的字串。
第二個代碼段的while回圈中的運算式可以寫成與第一個代碼段的while回圈中的運算式類似
while ( str[i])
或喜歡
while ( *( str i ) )
也就是說,任何非零值都被視為真運算式。
如果您不想更改str
第一個代碼片段中的原始指標,您可以引入一個中間指標,如
char *str = "Hello";
char *p = str;
while ( *p )
{
p ;
}
例如該功能strlen
可以通過以下方式實作
size_t strlen( const char *s )
{
const char *p = s;
while ( *p ) p;
return p - s;
}
uj5u.com熱心網友回復:
通常,使用字串指標進行迭代與遞增字串指標并取消參考它所給出的字符相同。
所以,唯一的區別是副作用,改變i與改變 str 指標。
uj5u.com熱心網友回復:
我認為使用 *str 將包含字符 '\0',因為它存盤在陣列最后一個位置的記憶體中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/493281.html