函數(shù)原型
? ? ? void *memcpy(void*dest, const void *src, size_t n);
功能
? ? ? 由src指向地址為起始地址的連續(xù)n個(gè)字節(jié)的數(shù)據(jù)復(fù)制到以destin指向地址為起始地址的空間內(nèi)。
頭文件
? C語(yǔ)言中使用#include 《string.h》;
? C++中使用#include 《cstring》和#include 《string.h》都可以
返回值
? ? ? 函數(shù)返回指向dest的指針旁涤。
說明
1.source和destin所指內(nèi)存區(qū)域不能重疊测蹲,函數(shù)返回指向destin的指針递惋。
2.與strcpy相比搔弄,memcpy并不是遇到'\0'就結(jié)束竹宋,而是一定會(huì)拷貝完n個(gè)字節(jié)救斑。
? ? ? memcpy用來做內(nèi)存拷貝泵琳,你可以拿它拷貝任何數(shù)據(jù)類型的對(duì)象心褐,可以指定拷貝的數(shù)據(jù)長(zhǎng)度舔涎;注意,source和destin都不一定是數(shù)組逗爹,任意的可讀寫的空間均可终抽。
? ? ? 例:
? ? char a[100], b[50];
? ? memcpy(b, a,sizeof(b));? ? ? //注意如用sizeof(a),會(huì)造成b的內(nèi)存地址溢出桶至。
? ? strcpy就只能拷貝字符串了昼伴,它遇到'\0'就結(jié)束拷貝;
? ? ? 例:
? ? ? ? char a[100], b[50];
? ? ? ? strcpy(a,b);
3.如果目標(biāo)數(shù)組destin本身已有數(shù)據(jù)镣屹,執(zhí)行memcpy()后圃郊,將覆蓋原有數(shù)據(jù)(最多覆蓋n)。如果要追加數(shù)據(jù)女蜈,則每次執(zhí)行memcpy后持舆,要將目標(biāo)數(shù)組地址增加到你要追加數(shù)據(jù)的地址色瘩。
? ? ? 4.注意最后一個(gè)參數(shù)size_t n;
? ? ? ? 例:? ?
? ? ? ? ? int a[10] = {0,1,2,3,4,5,6,7,8,9};
? ? ? memcpy(a, a + 3, 2);
? ? ? 你猜拷貝過之后a數(shù)組的值是什么逸寓?
? ? ? 3,4,2,3,4,5,6,7,8,9,
? ? ? 錯(cuò)>诱住!竹伸!
? ? ? 真實(shí)結(jié)果是:
? ? ? 3,1,2,3,4,5,6,7,8,9,
? ? ? 為什么泥栖?
? ? ? 因?yàn)閙emcpy的最后一個(gè)參數(shù)是需要拷貝的字節(jié)的數(shù)目!一個(gè)int類型占據(jù)4個(gè)字節(jié)勋篓!這樣的話吧享,要想達(dá)到將a+3地址開始的2個(gè)元素拷貝到a地址處,需要這么寫:
? ? ? memcpy(a, a + 3, 2*sizeof(int));
? ? ? 經(jīng)過這么一條語(yǔ)句譬嚣,a數(shù)組的內(nèi)容就變成了:
? ? ? 3,4,2,3,4,5,6,7,8,9,
? ? ? 這才是我們想要的钢颂!
下面是一些實(shí)例↓
實(shí)例1: 將字符串復(fù)制到數(shù)組 dest 中
運(yùn)行結(jié)果:dest = http://www.runoob.com
實(shí)例2: 將 s 中第 11 個(gè)字符開始的 6個(gè)連續(xù)字符復(fù)制到 d 中:
運(yùn)行結(jié)果:runoob
實(shí)例3: 覆蓋原有部分?jǐn)?shù)據(jù):
運(yùn)行結(jié)果:使用 memcpy 前: abcdefg
? ? ? ? ? ? ? ? ? 使用 memcpy 后: ***defg
? ? ? ? 愿你出走半生,歸來仍是少年…