這個主要用於我個人的學習筆記,便於以后查詢,順便分享給大家。
想必在用C的時候難免會與數組,指針,內存這幾樣東西打交道,先以數組為例,例如有一個數組int a[5] = {1, 2, 3, 4, 5},我們要將數組a里面的數據復制到數組b中,一般剛剛接觸C語言的我們會怎么做?我們一般會想到用循環來做吧

1 int i; 2 int a[5] = {1, 2, 3, 4, 5}, b[5]; 3 4 for(i = 0; i < 5; i++) 5 { 6 b[i] = a[i]; 7 }
但是,如果有多個數組要復制,或者強迫症看不慣自己寫的這么臃腫的代碼,不想這樣寫,我們該怎么辦?這時就要用到接下來要介紹的函數memcpy了。
memcpy
原型:
void *memcpy(void *dest, const void *src, size_t n);
需要的頭文件:
#include<string.h>
用法:
memcpy函數是內存拷貝函數,功能是從源src所指的內存地址的起始位置開始拷貝n個字節到目標dest所指的內存地址的起始位置中。
因為這個函數是直接操作內存的,所以我們一開始那個例子的執行效率會大大提高。不懂怎么用?我們來看一下代碼就行。
1 #include<string.h> 2 3 int main(void) 4 { 5 int a[5] = {1, 2, 3, 4, 5}, b[5]; 6 /*第一個參數是要保存的位置的起始地址,所以我們直接放b 7 *第二個參數是源數據的起始地址,所以我們把a放上去 8 *第三個參數是要復制的內存塊的長度,為a的長度sizeof(a)*/ 10 memcpy(b, a, sizeof(a)); 11 }
就這樣一行的代碼,就能代替我們之前的for循環,是不是簡潔高效了許多。這個函數的作用不僅僅是這樣,它還可以用與兩個字符串的復制,內存塊的復制等,各種數據類型都能復制,是不是一個很棒的函數呢*^_^*它的更多功能還待各自己去探索,有好用的技巧也請務必告訴我,我必將感謝。
那么,接下來,我們又有新的問題了,我們已經把a的數據傳給b了,所以想把a清零,我們要怎么做呢?
一、我們可以像以前那樣用循環來做,但是強迫症不接受啊。
二、我們可以用剛剛學到的memcpy函數,再弄一個初始化的數組c = {0, 0, 0, 0, 0},然后把c復制給a,但是這樣做就有點弄巧成拙了,還不如用方法一。
三、可以用我們接下了要介紹的memset函數,一句話搞定,新姿勢get :-)
memset
原型:
void *memset(void *s, int ch, size_t n);
用法:
memset是計算機中C/C++語言函數。將s所指向的某一塊內存中的前n個字節的內容全部設置為ch指定的ascii值, 第一個值為指定的內存地址,塊的大小由第三個參數指定,這個函數通常為新申請的內存做初始化工作, 其返回值為指向s的指針。
函數解釋:將s中當前位置后面的n個字節 (typedef unsigned int size_t )用 ch 替換並返回 s 。
memset:作用是在一段內存塊中填充某個給定的值,它是對較大的結構體或數組進行清零操作的一種最快方法。
以我們一開始提出的問題為例:
#include<string.h> int main(void) { int a[5] = {1, 2, 3, 4, 5}; memset(a, 0, sizeof(a)); }
就這樣就成功清零了,是不是很方便。
注意:
如果是字符數組的話,memset可以隨便用,但是如果是其他類型的數組,一般只用來清零,如果是填充數據就不合適了,如:
memset(a, 1, sizeof(a));
想用這個來把a所有元素設置為1,是不成功的,為什么呢?因為memset函數每次填充的數據長度為一個字節,即為0x01,而a的一個元素長度為4個字節,即0x00000000,如果把0x01填充進去,則填充的結果是0x01010101,而不是我們期待的0x00000001,所以是不合適的,但是用來清零真是一級棒!
這次的筆記就到這里了,希望能幫到大家。
作者:陳棟權
時間:2016/09/16
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,
且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
如有特別用途,請與我聯系郵箱:kingchen.gd@foxmail.com
最后有興趣的同學可以關注我的微信公眾號,可以隨時及時方便看我的文章。*^_^*
掃碼關注或者搜索微信號:King_diary