1. 程式人生 > >C語言傳參的型別匹配

C語言傳參的型別匹配

有一個這樣的問題:

  • 形參const char *p和實參char *c可以匹配
  • 形參const char**p和實參char**c不可以匹配

注:argument和parameter:嚴格而言,parameter指形參,argument指實參

ANSI C:

"每個實參都應該有一個型別,以便將其值賦給一個物件,這個物件具有相對應形參的型別的非限定版本"

含義:傳參相當於賦值,函式的形參將具有實參的非限定版本的資料,具體形參是否有限定型別有怎樣的限定型別由函式的形參列表指定,實參只負責傳值

"賦值操作應滿足下列之一:

...

兩個運算元都是指標,分別指向兩個相匹配的型別的限定或非限定版本,而且左運算元指向的型別必須有右運算元指向型別的所有限定符

..."

含義:ANSI C定義了幾種有效的賦值方式,上面描述了指標向賦值的情況。右運算元有的限定符左運算元也一定要有

解釋:

"const float*"不是限定型別而是非限定型別,型別為指向限定型別的指標

所以"const char**"是一個指向 指向限定型別的指標,是指向非限定型別的指標

"const char**"和"char**"都是指向非限定型別的指標,但是是不同的非限定型別

雖然他們兩個指向的非限定型別本身可以作為型別進行匹配,但是這兩個非限定型別的指標不能匹配,因為型別的解析不會遞迴的進行

const:

const的含義只是意味著這個識別符號不能被用來執行賦值操作,但是如果是指標(const type * p)的話,就是不能對*p執行賦值操作

所以const修飾的並不是常量,不能用在如結構體元素的大小相關宣告,某些編譯器的陣列宣告,case的表示式

這隻會使值通過這個識別符號是隻讀的,但是可能會被其他的方式修改

最常用的地方是函式的形參,因為函式只能通過引數名獲取到這個值,所以至少在這個函式中是不會被修改的