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