1. 程式人生 > >C語言學習筆記---好用的函式memcpy與memset

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

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,

且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。

最後有興趣的同學可以關注我的微信公眾號,可以隨時及時方便看我的文章。*^_^*

掃碼關注或者搜尋微訊號:King_diary 

相關推薦

C語言學習筆記---函式memcpymemset

這個主要用於我個人的學習筆記,便於以後查詢,順便分享給大家。 想必在用C的時候難免會與陣列,指標,記憶體這幾樣東西打交道,先以陣列為例,例如有一個數組int a[5] = {1, 2, 3, 4, 5},我們要將陣列a裡面的資料複製到陣列b中,一般剛剛接觸C語言的我們會怎麼做?我們一般會想到用迴圈來做吧

C語言學習筆記:指標函式函式指標的淺析

#include "stdio.h" #include "stdlib.h" #include <string.h> /*--------------指標函式---------------*/  int *f(int a,int b ){        int

C語言學習筆記:printf()函式詳解

C語言中有關printf()函式的詳細使用方法: 修飾符: - digit(s) :欄位寬度的最小值。如果該欄位不能容納要列印的數或者字串,系統就會使更寬的欄位。 如%4d。 - .digit(s):精度,將結果保留到小數點後的多少位。 - h: 和整數轉

C語言學習筆記---malloc函式詳解

                                                                                            malloc函式詳解 一、malloc函式標頭檔案: #include<stdli

C語言學習筆記_5函式程式結構

/**************************************************************************** *第五章函式與程式結構 *****2016

c語言學習筆記:字串常見的幾種函式

首先在使用字串函式時請務必匯入#include<string.h>1.strlen:獲取當前字串的長度。2.strcpy:拷貝字串到另一個字串。如strcpy(A,B);其中A和B分別代表兩個字串變數,此方法的意思是copy字串B到A,第一個引數是目標地址,第二個

C語言學習筆記--函式

** 1.函式的定義** 定義函式應該包括以下幾個內容: (1)指定函式的名字,以便以後按名呼叫 (2)指定函式的型別,即函式的返回值型別 (3)指定函式的引數的名字和型別,以便在呼叫函式時向他們傳遞資料。無參函式則不需要 (4)指定函式的功能 1.1 定義無參

C語言學習筆記(九)—— 函式、遞迴和指標

一、函式1、一個簡單的函式示例函式是完成特定任務的獨立程式程式碼單元。#include <stdio.h> void printStar();//宣告函式原型,函式原型會指明函式的型別和函式接受的引數。前面的void是函式型別,表明函式沒有返回值 #define

c 語言學習筆記(一)基礎

lac alert https 內容 con 標記 prime c++ prime c基礎 近期工作上有對C語言算法上的需求,所以要學C,上學的時候沒學過,只學過半年的Java(我是專升本,本科學的材料),2015年工作後也學過C,那時候的需求是能看懂就可以,也就沒深入研究

C語言學習筆記 (003) - C/C++中的實參和形參(轉)

變化 避免 影響 學習筆記 ++ nbsp 過去 情況 真的 今天突然看到一道關於形參和實參的題,我居然不求甚解。藐視過去在我的腦海裏只有一個參數的概念,對於形參和實參的區別還真的不知道,作為學習了幾年C++的人來說,真的深深感覺對不起自己對不起C++老師 T。T 我

C語言學習筆記

變量 col 語言學 指針變量 筆記 數組名 nbsp span 就是 一、指針 指針就是地址,指針變量是用來存放地址的變量,把誰的地址存放在指針變量中,就說此指針變量指向誰。 1.一維數組 一維數組名代表數組首元素的地址 &:取地址運算符。&a 是變量 a

梓益C語言學習筆記之常用鏈表操作函數

C語言 鏈表操作 梓益C語言學習筆記之常用鏈表操作函數一、創建鏈表void link_creat_head(STU **p_head,STU *p_new){ STU *p_mov=*p_head; if(*p_head==NULL) //當第一次加入鏈表為空時,head執行p_new { *

梓益C語言學習筆記之鏈表&動態內存&文件

C語言 鏈表 梓益C語言學習筆記之鏈表&動態內存&文件一、定義: 鏈表是一種物理存儲上非連續,通過指針鏈接次序,實現的一種線性存儲結構。二、特點: 鏈表由一系列節點(鏈表中每一個元素稱為節點)組成,節點在運行時動態生成(malloc),每個節點包括兩個部分: 存儲數據元素的數據域 存儲下一個節點地址的

梓益C語言學習筆記之常用字符串操作(sscanf & strtok)

C語言 字符串操作 梓益C語言學習筆記之常用字符串操作(sscanf & strtok)一、sscanf int sscanf(const char *buf,const char *format, …); \\從buf指定的內存區域中讀入信息 例: int a, b, c; ssc

c語言學習筆記.結構體.

成員訪問運算符 div 成員 bsp tro truct 年齡 可用 語言學 結構體:   一種用戶自定義的可用的數據類型,它允許您存儲不同類型的數據項。 定義/聲明: struct 類型名{ 成員1; 成員2; ... 成員n; } 變量

C語言學習筆記之字符串拼接的2種方法——strcat、sprintf

fir str return print 文章 %s rst stdlib.h 字符串拼接 本文為原創文章,轉載請標明出處 1. 使用strcat進行字符串拼接 #include <stdio.h> #include <stdlib.h> #incl

c語言學習筆記 if語句的條件判斷

圖片 分享 筆記 賦值 if條件 語句 int image 運算符 可能經常會看到錯誤的if語句示範,比如這樣的: if(a=6) {   printf("hello"); } if語句塊執行的條件是if條件的運算結果不是0則執行if語句塊。 a=6這是個賦值運算符

c語言學習筆記-if語句塊一定要加分號

學習 語言 括號 語句 執行 -i c語言學習 c語言 分號 if(a>6) printf("hello");//語句1 printf("world");//語句2 當a>6的時候,執行的分支語句是語句1,而不是語句1和語句2,雖然結果是語句1和語句2都被執

C語言學習筆記 〗(一) HelloWorld

文件頭部 標準 變量 標準輸出 class 語言學 你好 a.out 格式 前言 本文為c基礎入門學習筆記 正文 HelloWorld #include <stdio.h> //標準輸出流 int main() //每種語言都有一個執行入口,main方法就是其

C語言學習筆記之位運算求余

nbsp 位運算 sdn 縮小 .net 一次 得出 ngs 有效 我們都知道,求一個數被另一個數整除的余數,可以用求余運算符”%“,但是,如果不允許使用求余運算符,又該怎麽辦呢?下面介紹一種方法,是通過位運算來求余,但是註意:該方法只對除數是2的N次方冪