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

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

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

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

函數(shù)原型

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

應(yīng)用實例

我們將一個存放“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;
}

缺點

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

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

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

函數(shù)原型

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

應(yīng)用實例

我們依然將一個存放“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ù)=個數(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ù)=個數(shù)*數(shù)據(jù)類型大小
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", brr[i]);
    }
    return 0;
}

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

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

實現(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)

具體實現(xiàn)

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

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

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

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

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

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

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

return 0;

到此這篇關(guān)于詳解C語言中strcpy函數(shù)與memcpy函數(shù)的區(qū)別與實現(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ù)時在其他模塊中尋找其定義。此外extern也可用來進行鏈接指定
    2022-09-09
  • C++類繼承時的構(gòu)造函數(shù)

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

    這篇文章主要介紹了C++類繼承時的構(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í)行路徑,而不是嚴格按照語句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ句
    2022-04-04
  • C語言中strcmp的實現(xiàn)原型

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

    這篇文章主要介紹了C語言中strcmp的實現(xiàn)原型的相關(guān)資料,這里提供實例幫助大家理解這部分內(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í),共同進步
    2022-06-06
  • 關(guān)于C語言動態(tài)內(nèi)存管理介紹

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

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

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

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

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

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

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

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

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

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

最新評論