1. 程式人生 > >c語言好難——關於形參傳遞中有const的情況

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午 深圳