下面的概述是參考的這篇文章:
c語言程式設計中也有,也需要標頭檔案,
標頭檔案不只是c++的類才需要!
比如: c中的string.h, 記憶體操作的標頭檔案 #include
即是: c語言中, 函式/變數的宣告和實現, 也可以像c++一樣,
標頭檔案中, 哪些函式/變數需要使用extern來說明?
c語言有乙個約定: 凡是在對應的.c檔案中, 有那個函式的實現的, 就不加extern, 凡是沒有對應實現的, 就需要加extern.
extern的解決,相當於乙個口頭承諾, 乙個口頭約定, 口頭答應, 在linker連線時, 由聯結器(鏈結器)自動去找.不用我們去管的!!
exten的標頭檔案如何區分"定義宣告" - "引用宣告"?
(引用自: )
兩種方式:
1. 頂層宣告中,存在初始化語句是,表示這個宣告是定義宣告,其他宣告是引用宣告。c語言的所有檔案之中,只能有乙個定義宣告。按照這個模型,我們可以在first.h中定義如下tpye g_test=1;那麼就確定在first中的是定義宣告,在其他的所有宣告都是引用宣告。
2、省略儲存型別說明
在這個模型中,所有引用宣告要顯式的包括儲存類extern,而每個外部變數的唯一定義宣告中省略儲存類說明符。
c語言中 陣列並沒有和char* 指標完全等同起來:
int g_glob[100];
在另乙個檔案中引用宣告如下:
int * g_glob; // 這個錯誤!
在vc中,是可以編譯通過的,這種情況大家都比較模糊並且需要注意,陣列與指標類似,但並不等於說對陣列的宣告起變數就是指標。上面所說的的程式在執行時發現了問題,在引用宣告的那個檔案中,使用這個指標時總是提示記憶體訪問錯誤,原來我們的連線程式並不把指標與陣列等同,int g_glob[100];
並且最好再加上乙個extern,更加明了。
extern int g_glob[100]; 或者: extern int g_glob; 引用宣告不需要分配記憶體, 所以不需要指明陣列大小.
c語言程式在記憶體中的儲存區域:
**區;
常量區;
全域性/靜態(變數)區;
堆區/自由儲存區: malloc, free | new, delete
棧區(是一段公共記憶體區, 公共的: 是指所有的函式執行時,都是使用的這個區域, 這個區域被反覆的使用,
前乙個函式使用後, 退出時, "函式內的棧區被釋放", 什麼叫釋放, 並沒有記憶體清零這個動作,只是棧區
函式執行時留下的值, 這個值的型別是各種各樣的...但是由於位元組數的長度不同, 所以組合起來的值,完全
不可控, 所以是隨機的, 需要對其進行初始化)
關於函式的返回值問題?
返回值無非有兩種: 一是返回位址的, 比如陣列位址, 指標, 物件的位址, 也就是, 一般"非內部資料型別"
的返回值,最好用返回引用的方式;
另一種是返回拷貝傳值型別的, 一般, 返回的是"內部/基本"資料型別的,用這個傳值, 不要用傳引用.
那麼, 對於傳值的函式 的返回值, 函式退出時, 其記憶體被**, 也就是,程式無法引用得到, 那麼這個值怎麼傳出來呢?
網上的說法, 我比較相信的一種是: "函式退出 時,將返回值拷貝到" eax" 這個cpu內的暫存器中,後面的函式,你要
這個返回值, 你就去取, 你不要就算了, 但是過後的話,你就取不到,因為這個暫存器隨時都可能被覆蓋.
const 修飾函式?
修飾函式的返回值 const one_class_type * foo(..) , 表示這個函式的返回值是乙個常量指標, 因此它的
返回值只能付給 同型別的const 指標變數, 不能付給非const的.. 因為要強制保證const變數的值不被
直接/甚至修改!
const修飾類的成員函式的動作: 這時const要放在函式的最後: type foo(...) const , 它表示, foo函式不能修改它之外的成員變數, 但可以引用/呼叫外部的成員變數, 但是不能呼叫非const的成員函式.
sizeof 和 strlen 的列出幾個重要的區別:
1.sizeof是算符,strlen是函式。
2.sizeof可以用型別做引數(必須加括號)/普通變數,strlen只能用char*做引數,且必須是以''/0''結尾的。
sizeof還可以用函式做引數,比如:
short f();
printf("%d/n", sizeof(f()));
輸出的結果是sizeof(short),即2。
3.strlen計算的是字串的長度,sizeof計算的是變數使用的記憶體大小,不受裡面儲存的內容改變
4.strlen的結果要在執行的時候才能計算出來,時用來計算字串的長度,不是型別佔記憶體的大小。
5.sizeof後如果是型別必須加括弧,如果是變數名可以不加括弧。這是因為sizeof是個操作符不是個函式。
6.當適用了於乙個結構型別時或變數, sizeof 返回實際的大小, 當適用一靜態地空間陣列, sizeof歸還全部陣列的尺寸。 sizeof 操作符不能返回動態地被分派了的陣列或外部的陣列的尺寸 。
6.陣列作為引數傳給函式時傳的是指標而不是陣列fun(char [8])
fun(char )
都等價於 fun(char *)
在c++裡引數傳遞陣列永遠都是傳遞指向陣列首元素的指標,編譯器不知道陣列的大小
如果想在函式內知道陣列的大小, 需要這樣做:
進入函式後用memcpy拷貝出來,長度由另乙個形參傳進去
fun(unsiged char *p1, int len)
我們能常在用到 sizeof 和 strlen 的時候,通常是計算字串陣列的長度
C 標頭檔案與C語言標頭檔案的區別
c 標頭檔案與c語言標頭檔案的區別 c語言風格的標頭檔案 帶.h include 輸入 輸出函式 include 字串處理 include 雜項函式 記憶體分配 c 風格的標頭檔案 無.h include 資料流輸入輸出 include 字串類 include stl佇列容器 當c 需要包含c的標頭...
C語言的標頭檔案
1.在c檔案中在函式外部宣告變數,稱為為全域性變數。1 全域性變數如果加static關鍵字,表示只能在本檔案內訪問,而且只能從宣告處到檔案末尾的範圍內訪問。宣告時如果沒有初始化,會自動初始化乙個值,例如static int x,x預設值為0。如果a 函式中用到變數x,而x的定義 static int...
C語言的標頭檔案
標頭檔案 a.h ifndef a h define a h 定義方法,不提供實現 int add int a,int b endif add.c include a.h 實現標頭檔案a中定義的方法 int add int a,int b main.c include include a.h 若想在...