[英]C function return statement
目前正在使用第二版K&R書籍學習C。 我對這個示例以及如何將行變量的值從getlines
函數更改為字符串感到困惑。
int main()
{
char line[MAXLINE];
int found = 0;
while (getlines(line, MAXLINE))
printf("Test: %s\n", line);
}
int getlines(char s[], int lim)
{
int c, i;
i = 0;
while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
s[i++] = c;
if (c == '\n')
s[i++] = c;
s[i] = '\0';
return i;
}
程序輸出“ Test:[來自getlines的字符串]”。 如果我從未從getlines
的返回值中分配“ char line”到getlines
返回一個int
的事實, getlines
“ line”的值如何分配給我輸入到變量“ s”中的字符串?
您顯然假設函數getlines()
返回字符串。 它不是。
它返回讀入該行的字符數。 main中的line[]
變量作為參數傳遞給getlines ,該方法將該參數作為變量s[]
。 注意它是如何給s[i++]
分配字符s[i++]
。
當您將line
作為參數傳遞時, getline()
填充它。 返回的int
是執行后函數的狀態。
在C函數調用中,所有參數都由value傳遞,因此該函數具有它們的副本。 因此,函數永遠不可能更改參數。 聽起來似乎與您在此處觀察到的情況相矛盾,但事實並非如此:
C語言中的數組有些特殊。 數組標識符幾乎在任何地方( 數組 sizeof
除外)都會被評估為數組第一個元素 (也稱為指針)的地址 。 不可能分配一個數組,也不可能傳遞一個數組(作為函數參數或返回值)。
同樣,這看起來是矛盾的,但是函數聲明還有另一條規則:如果函數聲明包含數組類型 ,則會自動將其調整為相應的指針類型 。 所以你的功能
int getlines(char s[], int lim);
實際上是以下功能:*)
int getlines(char *s, int lim);
調整函數聲明中的類型以及將數組的標識符作為指針評估在一起的效果通常表示為數組作為指針的衰減 。 真正傳遞給函數的是指針,而不是數組。 索引該指針后,函數中的代碼將訪問原始數組。 指針當然是按值傳遞的 ,您的函數不會更改此指針,但可以更改它指向的指針。
*)風格注釋:我更喜歡始終使用指針類型編寫函數聲明,因為無論如何這都是編譯器所看到的,因此避免了混淆。 當然,有人認為寫數組類型是件好事,因為它記錄了該函數應該傳遞給數組的指針的意圖 。
如果我從未將“字符行”分配給getlines的返回值
正確,您永遠不要將getlines
的返回值分配給variable line
。
“ line”的值如何分配給我輸入到變量“ s”中的字符串
當您執行getlines(line, MAXLINE)
,變量line
盡管聲明為數組,但在傳遞時會衰減到指向數組第一個元素的指針。 然后,在getlines
中執行s[i++] = c;
,您實際上是在寫傳遞給getlines
的地址(或離開該地址的跳數)。 請記住,索引數組s[i++]
會隱式取消對i
引用,使其跳離s
包含的地址。 然后,當您在main
功能中打印line
,您會發現一些信息已放置在數組中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.