[英]Difference between ++*argv, *argv++, *(argv++) and *(++argv)
[英]Difference between *argv++ and *argv— when reaching the limit
有人可以解釋為什么
int main(int argc, const char * argv[]) {
while (* argv)
puts(* argv++);
return 0 ;
}
是合法的,並且
int main(int argc, const char * argv[]) {
argv += argc - 1;
while (* argv)
puts(* argv--);
return 0 ;
}
是不是? 在這兩種情況下,while循環內的增量都將指向argv的邊界之外。 為什么指向虛構的較高索引而不指向虛構的較低索引是合法的?
最好的祝福。
因為C標准說您可以形成一個指向數組末尾的指針,並且它仍然可以與數組中的指針進行正確比較(盡管您不能取消引用它)。
該標准沒有對數組開頭之前指向地址的指針進行任何說明,即使形成這樣的指針也會產生不確定的行為。
循環語義和半開間隔。 遍歷指針所指向的對象的數組或列表的慣用方式是:
for (T *p = array; p < array + count; p++)
在這里, p
最終越界(偏離一,指向數組末尾一個),因此(不僅僅在概念上)要求不調用未定義的行為是有用的(標准實際上強加了此要求) 。
該標准強制argv[argc]
等於NULL
,因此在增加argc
次數后取消引用argv是合法的。
在另一方面沒有被定義約前的地址argv
,所以argv - 1
可以是任何東西。
請注意,據我所知,argv是唯一保證以這種方式運行的字符串數組。
從標准:
5.1.2.2.1程序啟動
如果聲明了它們,則主函數的參數應遵循以下要求:
argv [argc]應為空指針
argv++
或++argv
是常量指針。
如果采用像char* arr[10]
這樣的簡單數組並嘗試使用arr++
,它將給出錯誤信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.