1. 程式人生 > >C中函數形參聲明為數組形式,它其實是指針

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

編譯 指針的指針 接受 printf 語言 執行 為什麽 [] while

問題描述:

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就是一個二級指針,指向指針的指針。

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