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語言學習筆記---好用的函式memcpy與memset
這個主要用於我個人的學習筆記,便於以後查詢,順便分享給大家。 想必在用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次方冪