C語言學習筆記---好用的函數memcpy與memset


這個主要用於我個人的學習筆記,便於以后查詢,順便分享給大家。

想必在用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 }
View Code

但是,如果有多個數組要復制,或者強迫症看不慣自己寫的這么臃腫的代碼,不想這樣寫,我們該怎么辦?這時就要用到接下來要介紹的函數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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM