C語言傳參的型別匹配
阿新 • • 發佈:2018-11-30
有一個這樣的問題:
- 形參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的表示式
這隻會使值通過這個識別符號是隻讀的,但是可能會被其他的方式修改
最常用的地方是函式的形參,因為函式只能通過引數名獲取到這個值,所以至少在這個函式中是不會被修改的