欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C語言中strcpy函數(shù)與memcpy函數(shù)的區(qū)別與實(shí)現(xiàn)

 更新時(shí)間:2022年12月29日 15:26:06   作者:ZHENGZJM  
這篇文章主要介紹了C語言中字符串拷貝函數(shù)(strcpy)與內(nèi)存拷貝函數(shù)(memcpy)的不同及內(nèi)存拷貝函數(shù)的模擬實(shí)現(xiàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

字符串拷貝函數(shù)(strcpy)

函數(shù)原型

由圖可知,strcpy的形參是(目的地址,來源地址),返回值為char *。

應(yīng)用實(shí)例

我們將一個(gè)存放“abcdefg”的字符數(shù)組arr的內(nèi)容拷貝到字符數(shù)組brr之中。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    char arr[10] = "abcdefg";
    char brr[10] = { 0 };
    strcpy(brr, arr);
    printf("%s", brr);
    return 0;
}

缺點(diǎn)

如果不是字符類型,還能這樣拷貝嗎?

我們發(fā)現(xiàn),編譯器直接報(bào)錯(cuò)了,因?yàn)樾螀⒏鷮?shí)參不兼容。 strcpy具有局限性,只能適用于字符類型的拷貝。我們想要任意類型的都能實(shí)現(xiàn)拷貝,那怎么辦呢?我們可以使用內(nèi)存拷貝函數(shù),不管三七二十一,你在這個(gè)內(nèi)存單元上,我就把你拷貝過去,這樣便實(shí)現(xiàn)了任意類型的拷貝 。

內(nèi)存拷貝函數(shù)(memcpy)

函數(shù)原型

由圖可知,memcpy的返回類型是void*,它的形參是(目標(biāo)地址,需要復(fù)制的地址,字節(jié)大?。?/p>

應(yīng)用實(shí)例

我們依然將一個(gè)存放“abcdefg”的字符數(shù)組arr的內(nèi)容拷貝到字符數(shù)組brr之中。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    char arr[10] = "abcdefg";
    int ret = strlen(arr);//求出字符串的長度
    char brr[10] = { 0 };
    memcpy(brr, arr,ret*sizeof(char));//字節(jié)數(shù)=個(gè)數(shù)*數(shù)據(jù)類型大小
    printf("%s", brr);
    return 0;
}

這次我們試試整型數(shù)組能不能拷貝過去。 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int brr[10] = { 0 };
    memcpy(brr, arr, 10*4);//字節(jié)數(shù)=個(gè)數(shù)*數(shù)據(jù)類型大小
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", brr[i]);
    }
    return 0;
}

成功了,這說明memcpy的適用范圍強(qiáng)于strcpy,那么memcpy是怎么實(shí)現(xiàn)的呢?

memcpy的模擬實(shí)現(xiàn)(my_memcpy)

實(shí)現(xiàn)樣例

void* my_memcpy(void* dest, void* src, size_t count)
{
    void* ret=dest;
    while (count--)
    {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + 1;
        src = (char*)src + 1;
    }
    return ret;
}

首先觀察它形式

我們依葫蘆畫瓢,也寫出類似的函數(shù)形式。 

void* my_memcpy(void* dest, void* src, size_t count)

具體實(shí)現(xiàn)

因?yàn)槲覀冇玫亩际莢oid*來接受參數(shù),目的是保證兼容性(畢竟你不知道使用者使用的時(shí)候用的是什么數(shù)據(jù)類型),但計(jì)算機(jī)不知道void*指的是什么,所以需要強(qiáng)制類型轉(zhuǎn)換。而強(qiáng)制類型轉(zhuǎn)換,換成什么類型好呢?如果我們用int型,我們知道一個(gè)int元素占4個(gè)字節(jié),那我們需要復(fù)制3個(gè)字節(jié)的東西咋辦?所以,我們用只占一個(gè)字節(jié)的char型。

*(char*)dest = *(char*)src;

在拷貝完一個(gè)字節(jié)之后,指針向后移動(dòng)一個(gè)字節(jié)

dest = (char*)dest + 1;
src = (char*)src + 1;

那么我們?nèi)绾慰刂瓶截惗嗌賯€(gè)字節(jié)呢?用while搭配count就行。

while (count--)
    {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + 1;
        src = (char*)src + 1;
    }

函數(shù)運(yùn)行完了,我們隨便返回一個(gè)值就行。

return 0;

到此這篇關(guān)于詳解C語言中strcpy函數(shù)與memcpy函數(shù)的區(qū)別與實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語言 strcpy memcpy內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++中extern函數(shù)使用詳解

    C/C++中extern函數(shù)使用詳解

    extern可以置于變量或者函數(shù)前,以標(biāo)示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時(shí)在其他模塊中尋找其定義。此外extern也可用來進(jìn)行鏈接指定
    2022-09-09
  • C++類繼承時(shí)的構(gòu)造函數(shù)

    C++類繼承時(shí)的構(gòu)造函數(shù)

    這篇文章主要介紹了C++類繼承時(shí)的構(gòu)造函數(shù),C++中,子類繼承父類除去構(gòu)造函數(shù)和析構(gòu)函數(shù)以外的所有成員。因此,子類需要編寫自己的構(gòu)造函數(shù)和析構(gòu)函數(shù)。更多相關(guān)詳情需要的小伙伴可以參考下面文章介紹
    2022-03-03
  • C語言圖文并茂講解分支語句用法

    C語言圖文并茂講解分支語句用法

    分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計(jì)方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ句
    2022-04-04
  • C語言中strcmp的實(shí)現(xiàn)原型

    C語言中strcmp的實(shí)現(xiàn)原型

    這篇文章主要介紹了C語言中strcmp的實(shí)現(xiàn)原型的相關(guān)資料,這里提供實(shí)例幫助大家理解這部分內(nèi)容,希望能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • C++類與對象深入之引用與內(nèi)聯(lián)函數(shù)與auto關(guān)鍵字及for循環(huán)詳解

    C++類與對象深入之引用與內(nèi)聯(lián)函數(shù)與auto關(guān)鍵字及for循環(huán)詳解

    朋友們好,這篇播客我們繼續(xù)C++的初階學(xué)習(xí),現(xiàn)在對一些C++的入門知識做了些總結(jié),整理出來一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們在評論區(qū)指出,我們相互學(xué)習(xí),共同進(jìn)步
    2022-06-06
  • 關(guān)于C語言動(dòng)態(tài)內(nèi)存管理介紹

    關(guān)于C語言動(dòng)態(tài)內(nèi)存管理介紹

    大家好,本篇文章主要講的是關(guān)于C語言動(dòng)態(tài)內(nèi)存管理介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Qt5實(shí)現(xiàn)qDebug日志信息寫入日志文件過程

    Qt5實(shí)現(xiàn)qDebug日志信息寫入日志文件過程

    這篇文章主要為大家介紹了Qt5實(shí)現(xiàn)qDebug日志信息寫入日志文件的過程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C語言實(shí)現(xiàn)餐廳管理系統(tǒng)

    C語言實(shí)現(xiàn)餐廳管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)餐廳管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++設(shè)計(jì)模式之原型模式

    C++設(shè)計(jì)模式之原型模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之原型模式,本文講解了什么是原型模式、為什么要使用原型模式、代碼實(shí)例等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • C++實(shí)現(xiàn)有向圖的鄰接表表示

    C++實(shí)現(xiàn)有向圖的鄰接表表示

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)有向圖的鄰接表表示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論