C語言拾遺

2021-05-28 02:02:00 字數 1930 閱讀 8665

main函式引數

c語言規定main函式引數只能有兩個,習慣上這兩個引數寫成argc和argv。c語言還規定argc必須是整形變數,argv必須是指向字串的指標陣列。

因此,main函式的函式頭應該寫為:

main(argc,argv)

int argc;

char *argv;

或者:main(int argc,char *argv)

main函式的引數值是從作業系統命令列上獲得的。當我們要執行乙個可執行檔案時,在命令列中輸入檔名,再輸入實際引數即可把這些實參傳送到main的形參中。

argc值:在輸入命令行時由系統按實際引數的個數自動賦予。

argv[0] 指向程式執行的全路徑名

argv[1] 指向在dos命令列中執行程式名後的第乙個字串

argv[2] 指向執行程式名後的第二個字串

argv[argc]為null。

extern

extern可以置於變數或者函式之前,以表示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。

extern用在變數宣告中常常有這樣乙個作用,你在*.c檔案中宣告了乙個全域性變數,這個全域性變數如果要被引用,就放在*.h中並用extern來宣告。

現代編譯器一般採用按檔案編譯的方式,因此在編譯時,全域性變數的可見域限制在檔案內部。下面舉乙個簡單的例子。建立乙個工程,裡面含有a.cpp和b.cpp兩個簡單的c++原始檔:

int i;

void main()

int i;

這兩個檔案極為簡單,在a.cpp中我們定義了乙個全域性變數i,在b中我們也定義了乙個全域性變數i。

linking...

b.obj : error lnk2005: "int i" (?i@@3ha) already defined in a.obj

debug/a.exe : fatal error lnk1169: one or more multiply defined symbols found

error executing link.exe.

a.exe - 2 error(s), 0 warning(s)

這就是說,在編譯階段,各個檔案中定義的全域性變數相互是透明的,編譯a時覺察不到b中也定義了i,同樣,編譯b時覺察不到a中也定義了i。

但是到了鏈結階段,要將各個檔案的內容「合為一體」,因此,如果某些檔案中定義的全域性變數名相同的話,在這個時候就會出現錯誤,也就是上面提示的重複定義的錯誤。

因此,各個檔案中定義的全域性變數名不可相同。

在鏈結階段,各個檔案的內容(實際是編譯產生的obj檔案)是被合併到一起的,因而,定義於某檔案內的全域性變數,在鏈結完成後,它的可見範圍被擴大到了整個程式。

檔案中定義的全域性變數的可見性擴充套件到整個程式是在鏈結完成之後,而在編譯階段,他們的可見性仍侷限於各自的檔案。

編譯器的目光不夠長遠,編譯器沒有能夠意識到,某個變數符號雖然不是本檔案定義的,但是它可能是在其它的檔案中定義的。

雖然編譯器不夠遠見,但是我們可以給它提示,幫助它來解決上面出現的問題。這就是extern的作用了。

我們為上面的錯誤程式加上extern關鍵字:

extern int i;

void main()

i = 100; //試圖使用b中定義的全域性變數

int i;

順利通過編譯,鏈結。

字串長度

sizeof用於獲取字元陣列的位元組數(包括結束符\0)

size_t strlen(const char *string); 用於獲取字元陣列的位元組數(不包括結束符\0)

name

atoi

synopsis

int atoi(const char *nptr);

long atoi(const char *nptr);

C語言拾遺

保證某些全域性變數的常量性 c c 中不能通過變數來定義陣列 const int row 10 const int col 10 c define row 10 define col 10orenum c style型別轉換 new type expression static cast expre...

C語言拾遺

1.操作符與基本型別 賦值運算子的優先順序低於算數運算子。如 x 3 2即x 3 2 優先順序 高於 高於 高於 一元操作符的關聯是從右到左,和 都必須邦定乙個變數或者叫 左值 如 x 注意 x 並不是左值。例如 z x y,相當於 z x y 字元 0 對應ascii的48,a 對應的是65。無論...

C語言拾遺

1 標頭檔案裡不要放全域性變數,被多次包含時,生成.o檔案連線時會衝突 2 函式體裡變數宣告都要放到前面 3 編譯錯誤 error two or more data types in declaration specifiers 一般都是少了分號,檢查你的 4 引用庫函式時,有函式宣告,使用也沒錯,...