关于C语言的一些小知识点
1.memcpy
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#include <string.h>
功能:由src所指內(nèi)存區(qū)域復(fù)制count個字節(jié)到dest所指內(nèi)存區(qū)域。
說明:src和dest所指內(nèi)存區(qū)域不能重疊,函數(shù)返回指向dest的指針。可以拿它拷貝任何數(shù)據(jù)類型的對象。
舉例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),會造成b的內(nèi)存地址溢出。
?
2.malloc()和calloc()
函數(shù)malloc()和calloc()都可以用來動態(tài)分配內(nèi)存空間,但兩者稍有區(qū)別。
??? malloc()函數(shù)有一個參數(shù),即要分配的內(nèi)存空間的大小:
??? void *malloc(size_t size);
??? calloc()函數(shù)有兩個參數(shù),分別為元素的數(shù)目和每個元素的大小,這兩個參數(shù)的乘積就是要分配的內(nèi)存空間的大小。
??? void *calloc(size_t numElements,size_t sizeOfElement);
??? 如果調(diào)用成功,函數(shù)malloc()和函數(shù)calloc()都將返回所分配的內(nèi)存空間的首地址。
??? 函數(shù)malloc()和函數(shù)calloc()的主要區(qū)別是前者不能初始化所分配的內(nèi)存空間,而后者能。如果由malloc()函數(shù)分配的內(nèi)存空間原來沒有被使用過,則其中的每一位可能都是0;反之,如果這部分內(nèi)存曾經(jīng)被分配過,則其中可能遺留有各種各樣的數(shù)據(jù)。也就是說,使用malloc()函數(shù)的程序開始時(內(nèi)存空間還沒有被重新分配)能正常進行,但經(jīng)過一段時間(內(nèi)存空間還已經(jīng)被重新分配)可能會出現(xiàn)問題。
??? 函數(shù)calloc()會將所分配的內(nèi)存空間中的每一位都初始化為零,也就是說,如果你是為字符類型或整數(shù)類型的元素分配內(nèi)存,那麼這些元素將保證會被初始化為0;如果你是為指針類型的元素分配內(nèi)存,那麼這些元素通常會被初始化為空指針;如果你為實型數(shù)據(jù)分配內(nèi)存,則這些元素會被初始化為浮點型的零。
?
3.fread()
功 能: 從一個流中讀數(shù)據(jù)
函數(shù)原型: int fread(void *ptr, int size, int nitems, FILE *stream);
參 數(shù):用于接收數(shù)據(jù)的地址(指針)(ptr)
單個元素的大小(size) :單位是字節(jié)而不是位,例如讀取一個整數(shù)值就是4
元素個數(shù)(nitems)
提供數(shù)據(jù)的文件指針(stream)
返回值:成功讀取的元素個數(shù)
完成一次讀操作(fread())后,如果沒有關(guān)閉流(fclose()),則指針(FILE * stream)自動向后移動前一次讀寫的長度,不關(guān)閉流繼續(xù)下一次讀操作則接著上次的輸出繼續(xù)輸出。
4.fflush(stdout)
在printf()后使用fflush(stdout)的作用是立刻將要輸出的內(nèi)容輸出。
當(dāng)使用printf()函數(shù)后,系統(tǒng)將內(nèi)容存入輸出緩沖區(qū),等到時間片輪轉(zhuǎn)到系統(tǒng)的輸出程序時,將其輸出。
使用fflush(out)后,立刻清空輸出緩沖區(qū),并把緩沖區(qū)內(nèi)容輸出。
例如:
for (ctr = 1; ctr <= wait; ctr++)
{
printf("."); /* print a dot */
fflush(stdout); /* force dot to print on buffered machines */
sleep((int) 1); /* pause 1 second */
}
用fflush(stdout)能使機器每輸出一個.暫停一秒鐘,而不會出現(xiàn)亂序(例如:PP。。。PP。PPP。。。等)現(xiàn)象。
?
5.define
#define A(x) T_##x
#define B(x) #@x
#define C(x) #x
假設(shè):x=1,則有:
A(1)------〉T_1
B(1)------〉'1'
C(1)------〉"1"
6.assert()
assert宏的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程序執(zhí)行,原型定義:
#include <assert.h>
void assert( int expression );
assert的作用是現(xiàn)計算表達式 expression ,如果其值為假(即為0),那么它先向stderr打印一條出錯信息,然后通過調(diào)用 abort 來終止程序運行。
?
7.static關(guān)鍵字
在C語言中,static的作用有三條。
(1) 隱藏。
當(dāng)我們同時編譯多個文件時,所有未加static前綴的全局變量和函數(shù)都具有全局可見性。利用這一特性可以在不同的文件中定義同名函數(shù)和同名變量,而不必擔(dān)心命名沖突。Static可以用作函數(shù)和變量的前綴,對于函數(shù)來講,static的作用僅限于隱藏,而對于變量,static還有下面兩個作用。
(2) 保持變量內(nèi)容的持久。
存儲在靜態(tài)數(shù)據(jù)區(qū)的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態(tài)存儲區(qū):全局變量和static變量,只不過和全局變量比起來,static可以控制變量的可見范圍,說到底static還是用來隱藏的。
(3) 默認(rèn)初始化為0。
其實全局變量也具備這一屬性,因為全局變量也存儲在靜態(tài)數(shù)據(jù)區(qū)。在靜態(tài)數(shù)據(jù)區(qū),內(nèi)存中所有的字節(jié)默認(rèn)值都是0x00,某些時候這一特點可以減少程序員的工作量。比如初始化一個稀疏矩陣,我們可以一個一個地把所有元素都置0,然后把不是0的幾個元素賦值。如果定義成靜態(tài)的,就省去了一開始置0的操作。
最后對static的三條作用做一句話總結(jié)。首先static的最主要功能是隱藏,其次因為static變量存放在靜態(tài)存儲區(qū),所以它具備持久性和默認(rèn)值0。
轉(zhuǎn)載于:https://www.cnblogs.com/yucan/archive/2010/12/20/1911675.html
總結(jié)
以上是生活随笔為你收集整理的关于C语言的一些小知识点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET两种图片上传方式
- 下一篇: MBA必读:不能触碰的5大职场高压线