c語言好難——關於形參傳遞中有const的情況
這是在逛論壇的時候看到的一個問題。
例1:
char *ptr;
void demo(const char* p)
{
;
}
int main(void)
{
demo(prt);
}
編譯後不報錯。
例2:
char *ptr[];
void demo(const char* p[])
{
;
}
int main(void)
{
demo(prt);
}
編譯後報錯,..\APP\main.c(37): error: #167: argument of type"char *" is incompatible with parameter of type "const char**" ,錯誤意為形參傳遞不合適。
先分析例2:
報錯原因是形參與實參的指標型別不一致。
以下是原因分析,在c語言中,形參為陣列時候,會退化為一維指標,所以const char* p[] 等價於 const char **p,
當 *prt[] 變數作為形參傳遞的時候,等價於 char **ptr,
當執行demo(ptr)的時候,實參傳遞給形參,等價於實參賦值給形參,即下面這條語句,
**p = **ptr;
本質上是兩個指標數值的傳遞,但是形參是指向const char型別 的指標,而實參是指向 char p型別的指標,由於兩個指標的型別不一致,報錯。
然後是例1:
本質上等價於*p = *ptr;
形參p指向const char型別的變數,實參是指向char型別的變數,兩種變數的型別是一致的,且滿足賦值語句的限制項的要求,不報錯。
這裡要理解兩件事情:
1、 指標是不存在限制項的;
2、 函式形參傳遞類同於變數初始化;
例2中的“指標指向const char 的指標”這句話裡面的“const char的指標”就是指標的型別,而實參的指標型別是“指向char 的指標”,兩者的型別不一致,所以報錯。而例1中的是實參傳遞給形參,是兩個變數間的賦值操作,變數是有限制項。在例1中形參為char型變數,實參也為char型變數,兩者均為char型變數,滿足了c語言賦值操作的一個條件,而形參,即左操作符的有const限制項,實參沒有,符合c語言中的賦值操作中的左操作符需要包含右操作符的限制項的要求。(這裡的參考文獻請看c89中關於賦值的介紹)
關於c語言的賦值需要滿足以下的要求(C89)
以上均為一家之言,如果錯誤,懇請斧正。
寫於2017-2-6午 深圳