C中函數形參聲明為數組形式,它其實是指針


問題描述:

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類型的數組


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM