這個主要用於我個人的學習筆記,便於以後查詢,順便分享給大家。
想必在用c的時候難免會與陣列,指標,記憶體這幾樣東西打交道,先以陣列為例,例如有乙個陣列int a[5] = ,我們要將陣列a裡面的資料複製到陣列b中,一般剛剛接觸c語言的我們會怎麼做?我們一般會想到用迴圈來做吧
int i;
int a[5]
=, b[5]
;for
(i =
0; i <
5; i++
)
但是,如果有多個陣列要複製,或者強迫症看不慣自己寫的這麼臃腫的**,不想這樣寫,我們該怎麼辦?這時就要用到接下來要介紹的函式memcpy了。
memcpy
原型:
void
*memcpy
(void
*dest,
const
void
*src, size_t n)
;
需要的標頭檔案:
#include
用法:
memcpy函式是記憶體拷貝函式,功能是從源src所指的記憶體位址的起始位置開始拷貝n個位元組到目標dest所指的記憶體位址的起始位置中。
因為這個函式是直接操作記憶體的,所以我們一開始那個例子的執行效率會大大提高。不懂怎麼用?我們來看一下**就行。
1 #include23
intmain
(void)4
, b[5]
;6/*第乙個引數是要儲存的位置的起始位址,所以我們直接放b
7 *第二個引數是源資料的起始位址,所以我們把a放上去
8 *第三個引數是要複製的記憶體塊的長度,為a的長度sizeof(a)*/
10memcpy
(b, a,
sizeof
(a));11
}
就這樣一行的**,就能代替我們之前的for迴圈,是不是簡潔高效了許多。這個函式的作用不僅僅是這樣,它還可以用與兩個字串的複製,記憶體塊的複製等,各種資料型別都能複製,是不是乙個很棒的函式呢*_*它的更多功能還待各自己去探索,有好用的技巧也請務必告訴我,我必將感謝。
那麼,接下來,我們又有新的問題了,我們已經把a的資料傳給b了,所以想把a清零,我們要怎麼做呢?
一、我們可以像以前那樣用迴圈來做,但是強迫症不接受啊。
二、我們可以用剛剛學到的memcpy函式,再弄乙個初始化的陣列c = ,然後把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
intmain
(void);
memset
(a,0
,sizeof
(a))
;}
就這樣就成功清零了,是不是很方便。
注意:如果是字元陣列的話,memset可以隨便用,但是如果是其他型別的陣列,一般只用來清零,如果是填充資料就不合適了,如:
memset
(a,1
,sizeof
(a))
;
想用這個來把a所有元素設定為1,是不成功的,為什麼呢?因為memset函式每次填充的資料長度為乙個位元組,即為0x01,而a的乙個元素長度為4個位元組,即0x00000000,如果把0x01填充進去,則填充的結果是0x01010101,而不是我們期待的0x00000001,所以是不合適的,但是用來清零真是一級棒!
這次的筆記就到這裡了,希望能幫到大家。
memset 函式與memcpy 函式
memset memset是c庫函式void memset void s,int ch,size t n 函式解釋 將s中當前位置後面的n個位元組用ch替換並返回s。作用 在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快的方法。note 盡量用memset將乙個陣列設...
memset與memcpy的用法
最近程式設計過程中,一直遇到mencpy和menset,於是將其用法做個總結,方便後續查閱。memcpy 函式原型 extern void memcpy void dest,void src,unsigned int count 標頭檔案 include 功能 由src所指記憶體區域複製count個...
strcpy函式與memcpy函式
strcpy函式與memcpy函式 6.2 字串與陣列 字串一般是用字元陣列的方式儲存,例如下面的str定義 char str 123456 這裡str是乙個字元陣列,它存放了乙個字串 123456 由於字串還有乙個結束符 0 所以此陣列的長度為7而不是6。6.2.1 strcpy函式與memcpy...