問題描述:
1 void writelines(char *lineptr[], int nlines) 2 { 3 while(nlines-- > 0) 4 { 5 printf("%s\n", *lineptr++); 6 } 7 }
C語言規定,數組名指向數組的首地址,數組已經定義,則數組名也就定了,不可更改,所以數組名是一個常量,不能對它執行變量相關的操作,比如說賦值或者自增等,那么為什么在上圖中第一行中lineptr被定義為一個字符指針數組,為什么在第5行中卻對它進行了自增操作?
原因:在一般情況下,數組名的確是不可修改的,只是在上圖第一行中lineptr作為函數形參,其實編譯器並不是把它當做數組名,而是看作一個指針
可以這樣思考一下:c語言規定,數組名作為實參傳遞給被調用函數相應形參的不是整個數組,而是數組的首地址,也就是指針,那么如果lineptr被認為是一個數組名的話,由於數組名不可被賦值,那么實參將不能傳遞給形參,所以編譯器將lineptr認為是一個指針變量,只有當它是一個指針變量時,它才能心安理得地接受主調函數傳過來的實參,所以 當一個函數的形參被聲明為數組形式時,在編譯器眼中它不是數組,而是一個指針變量。
另:上次說到了二級指針,其實,這里的lineptr就是一個二級指針,指向指針的指針。
如果是void writelines(char lineptr[]); 如果是這種形式的話,那么lineptr也是指針,一級指針,指向的是char類型的數組