2012-02-24 62 views
1
#include <stdio.h> 

main(argc, argv) 
int argc; 
char *argv[]; 
{ 
    register int i, nflg; 

    nflg = 0; 
    if(argc > 1 && argv[1][0] == '-' && argv[1][1] == 'n') { 
     nflg++; 
     argc--; 
     argv++;  //Incements a constant pointer, how??? 
    } 
    for(i=1; i<argc; i++) { 
     fputs(argv[i], stdout); 
     if (i < argc-1) 
      putchar(' '); 
    } 
    if(nflg == 0) 
     putchar('\n'); 
    exit(0); 
} 

該程序遞增argv的值,但argv是C中的常量指針。爲什麼我從此沒有得到編譯錯誤?V7 Echo程序增加一個常量指針,怎麼樣?

+0

'argv'不是一個指針,它是一個指針數組。只有當你將它們傳遞給期望指針的函數時,數組纔會衰減爲指針。 – 2012-02-24 17:36:39

+1

相關:http://stackoverflow.com/questions/6226027/incrementing-an-array-of-pointers-in-c,這裏你只是看一個預標準的C程序。 – 2012-02-24 17:37:42

+0

@AlexandreC:否,'argv'是*不是*指針數組;請記住,在函數參數聲明的上下文中,T a []被解釋爲'T * a'。在這種情況下,'argv'是'char **'類型,所以'++'是允許的。 – 2012-02-24 19:30:50

回答

2

首先,的argv類型是char **(記住,在一個功能參數聲明的上下文中,T a[]是同義詞T *a) 。因此它是一個指針類型,而不是數組類型,所以不會立即禁止使用++運算符。其次,雖然這看起來像舊式K & R C,但它仍被認爲是有效的。下面是C99的標準(n1256)說,大約argcargv

5.1.2.2.1 Program startup
...
2 If they are declared, the parameters to the main function shall obey the following constraints:
...
— The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination.

所以表達式argv++是完全合法的。

4

argv不是常量指針。它被定義爲char *argv[]。由於這是K&R C,該定義是在不同的地方比在ANSI C.

其次,即使它被定義爲const char *argv[],這是一個常規指針常量字符串。你不能通過該指針寫入內存,但你可以改變指針本身。

恆定指針到恆定串將被定義爲const char ** const argv

+0

因此,在K&R C中,這是否有效: int a [3]; a ++; – bhuwansahni 2012-02-24 17:51:44

+0

這在我知道的每一個C版本中都是有效的。但是函數參數的類型是在別的地方定義的。 – Gandaro 2012-02-24 18:08:53

+0

這不是有效的ANSI C(我得到'錯誤:gcc需要作爲增量操作數所需的左值),我認爲它也不是有效的K&R。增加一個指針(比如'int * a; a ++')是有效的。一個指針可以用作數組('int * a; a [2];'),但是用存儲空間定義的數組與指針不同。 – 2012-02-24 18:51:04