最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言?xún)?nèi)存函數(shù)的具體使用

 更新時(shí)間:2024年11月05日 11:30:35   作者:愛(ài)編程的小新☆  
本文介紹了C語(yǔ)言中幾個(gè)常用的內(nèi)存函數(shù),包括memcpy、memmove、memset、memcmp的使用方法及其模擬實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

上期我們學(xué)習(xí)了字符函數(shù)以及字符串函數(shù),但是字符串函數(shù)僅僅只能對(duì)字符進(jìn)行操作,那么這次我們來(lái)學(xué)習(xí)一下內(nèi)存函數(shù)

在C語(yǔ)言中內(nèi)存函數(shù)是一組用于內(nèi)存操作的標(biāo)準(zhǔn)庫(kù)函數(shù),它們定義在 <string.h>頭文件中,這些函數(shù)用于復(fù)制、設(shè)置、比較內(nèi)存區(qū)域等,接下來(lái)我們來(lái)學(xué)習(xí)一下C語(yǔ)言中常用的內(nèi)存函數(shù)。

1. memcpy 使?和模擬實(shí)現(xiàn)

memcpy與strcpy非常相似,但是strcpy只能對(duì)字符進(jìn)行復(fù)制操作,而memcpy可以對(duì)任意類(lèi)型的數(shù)據(jù)進(jìn)行復(fù)制操作。

1.1 memcpy的使用

  • 函數(shù)memcpy從source的位置開(kāi)始向后復(fù)制num個(gè)字節(jié)的數(shù)據(jù)到destination指向的內(nèi)存位置。
  • 這個(gè)函數(shù)在遇到 '\0' 的時(shí)候并不會(huì)停下來(lái)。
  • 如果source和destination有任何的重疊,復(fù)制的結(jié)果都是未定義的。

memcpy的使用:

#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

運(yùn)行結(jié)果:

可以這里的num參數(shù)為20, 表示從 arr1 復(fù)制20個(gè)字節(jié)的數(shù)據(jù)到 arr2中,因?yàn)檫@里復(fù)制的內(nèi)容為整數(shù),整形的大小占4個(gè)字節(jié),所以arr2從arr1中復(fù)制了前5個(gè)數(shù)字(也就是20個(gè)字節(jié)的數(shù)據(jù))

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

既然知道了memcpy函數(shù)是如何使用的,那么我們接下來(lái)探索一下memcpy是如何實(shí)現(xiàn)的

#include<stdio.h>
#include<string.h>
#include<assert.h>
void* my_memcpy(void* dst, const void* src, size_t num)
{
	void* ret = dst;
	assert(dst);
	assert(src);
	
	while (num--) {
		*(char*)dst = *(char*)src;
		dst = (char*)dst + 1;
		src = (char*)src + 1;
	}
	return(ret);
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	my_memcpy(arr2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

運(yùn)行結(jié)果:

我們可以看見(jiàn)模擬實(shí)現(xiàn)的my_memcpy函數(shù)與上面使用的memcpy函數(shù)的運(yùn)行結(jié)果是一樣的

從中memcpy的前兩個(gè)形參使用的是void *類(lèi)型來(lái)接收的,void *類(lèi)型不能進(jìn)行解引用和加減運(yùn)算,所以在解引用和加減運(yùn)算之前需要強(qiáng)制轉(zhuǎn)換成char *類(lèi)型進(jìn)行操作

函數(shù)的返回值是void*類(lèi)型,返回的是目標(biāo)地址,所以在進(jìn)行指針運(yùn)算前,我們需要先創(chuàng)建一個(gè)指針(ret)存儲(chǔ)目標(biāo)地址,當(dāng)復(fù)制操作完成后,返回目標(biāo)地址

注意這里的dst和src是指針變量,所以在使用前用assert斷言判斷一下是否為NULL(空指針),并且因?yàn)閟rc指針指向的數(shù)據(jù)是不能被修改的,所以這里用const進(jìn)行修飾。

注意:memcpy只負(fù)責(zé)處理內(nèi)存不重疊的情況,對(duì)于重疊內(nèi)存拷貝使用memmove

2. memmove 使?和模擬實(shí)現(xiàn)

memmove函數(shù)的參數(shù)與memcpy函數(shù)是一樣的

  • 和memcpy的差別就是memmove函數(shù)處理的源內(nèi)存塊和?標(biāo)內(nèi)存塊是可以重疊的。
  • 如果源空間和?標(biāo)空間出現(xiàn)重疊,就得使?memmove函數(shù)處理。

2.1 memmove的使用

#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr1 + 2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

運(yùn)行結(jié)果:

那么為什么memmove函數(shù)能夠處理內(nèi)存重疊的情況呢?接下來(lái)我們來(lái)模擬實(shí)現(xiàn)一下memmove函數(shù)。

2.2 memmove模擬實(shí)現(xiàn)

#include<stdio.h>
#include<string.h>
#include<assert.h>
void* my_memmove(void* dst, const void* src, size_t count)
{
	void* ret = dst;
	if (dst <= src || (char*)dst >= ((char*)src + count))
	{
		
		while (count--) 
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst + 1;
			src = (char*)src + 1;
		}
	}
	else 
	{
		dst = (char*)dst + count - 1;
		src = (char*)src + count - 1;
		while (count--) 
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst - 1;
			src = (char*)src - 1;
		}
	}
	return(ret);
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr1 + 2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

memmove的模擬實(shí)現(xiàn)與memcpy是相似的,但是這里需要分為兩種情況討論:

1. 目標(biāo)地址>源內(nèi)存地址

如果目標(biāo)地址 > 源內(nèi)存地址,那么我們就需要將數(shù)據(jù)從后向前進(jìn)行拷貝,如果從前向后進(jìn)行拷貝就會(huì)發(fā)生下面的現(xiàn)象

當(dāng)我們從后面向前拷貝就不會(huì)出現(xiàn)這種現(xiàn)象:

2. 目標(biāo)地址<源內(nèi)存地址

如果目標(biāo)地址 < 源內(nèi)存地址,那么我們就需要將數(shù)據(jù)從前向后進(jìn)行拷貝

3. 目標(biāo)地址=源內(nèi)存地址

當(dāng)目標(biāo)地址=源內(nèi)存地址時(shí),既可以使用從前向后的方式拷貝也可以使用從后向前的方式拷貝。

3. memset 函數(shù)的使?

memset是?來(lái)設(shè)置內(nèi)存的,將內(nèi)存中的值以字節(jié)為單位設(shè)置成想要的內(nèi)容。

  • ptr表示更改的起始地址
  • value表示更改的內(nèi)容
  • num表示更改的字節(jié)數(shù)

memset的使用:

int main()
{
	char str[] = "hello world";
	memset(str, 'x', 6);
	printf(str);
	return 0;
}

運(yùn)行結(jié)果:

memset函數(shù)將str數(shù)組中的前6個(gè)字節(jié)的數(shù)據(jù)更改成了 ’x‘  

4.memcmp 函數(shù)的使用

memcmp是用于比較兩塊內(nèi)存
將指針 1 所指內(nèi)存塊的前 num 個(gè)字節(jié)與指針 2 所指內(nèi)存塊的前num個(gè)字節(jié)進(jìn)行比較,如果它們完全匹配,則返回零,否則返回一個(gè)不等于零的值,表示哪個(gè)更大。

返回值如下:

 memcmp函數(shù)的使用:

這里我們比較的是兩個(gè)整形數(shù)組前4個(gè)數(shù)據(jù)的大小, 一個(gè)整形的大小為4個(gè)字節(jié),所以比較的是16個(gè)字節(jié)數(shù)據(jù)的大小,arr前16個(gè)字節(jié)的數(shù)據(jù)<arr2前16個(gè)字節(jié)的數(shù)據(jù),所以返回值為-1。

結(jié)語(yǔ)

那么以上就是C語(yǔ)言中常用的內(nèi)存函數(shù),學(xué)完內(nèi)存函數(shù)后,對(duì)于復(fù)制、設(shè)置、比較等操作就不僅僅只局限在字符中了,也可以對(duì)任意類(lèi)型的數(shù)據(jù)進(jìn)行復(fù)制、設(shè)置、比較等操作。到此這篇關(guān)于C語(yǔ)言?xún)?nèi)存函數(shù)的具體使用的文章就介紹到這了,更多相關(guān)C語(yǔ)言?xún)?nèi)存函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解C++中普通舊數(shù)據(jù)(POD)的使用

    詳解C++中普通舊數(shù)據(jù)(POD)的使用

    普通舊數(shù)據(jù)就是內(nèi)存中的連續(xù)字節(jié)序列,是能夠被“僅當(dāng)作數(shù)據(jù)”處理的對(duì)象。這篇文章主要帶大家了解一下C++中普通舊數(shù)據(jù)的定義與使用,感興趣的可以了解下
    2023-03-03
  • C語(yǔ)言原子操作的實(shí)現(xiàn)示例

    C語(yǔ)言原子操作的實(shí)現(xiàn)示例

    本文主要介紹了C語(yǔ)言中原子操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • C++回調(diào)函數(shù)的理解和使用教程

    C++回調(diào)函數(shù)的理解和使用教程

    這篇文章主要給大家介紹了關(guān)于C++回調(diào)函數(shù)的理解和使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 詳解C語(yǔ)言常用的一些轉(zhuǎn)換工具函數(shù)

    詳解C語(yǔ)言常用的一些轉(zhuǎn)換工具函數(shù)

    這篇文章主要介紹了C語(yǔ)言常用的一些轉(zhuǎn)換工具函數(shù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • VisualStudio Community2019在安裝的過(guò)程中無(wú)法進(jìn)入安裝界面的解決方法

    VisualStudio Community2019在安裝的過(guò)程中無(wú)法進(jìn)入安裝界面的解決方法

    這篇文章主要介紹了VisualStudio Community2019在安裝的過(guò)程中無(wú)法進(jìn)入安裝界面的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Visual Studio2019調(diào)試DLL的實(shí)現(xiàn)

    Visual Studio2019調(diào)試DLL的實(shí)現(xiàn)

    本文主要介紹了Visual Studio2019調(diào)試DLL的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • C++加密解密php代碼的方法

    C++加密解密php代碼的方法

    這篇文章主要介紹了C++加密解密php代碼的方法,實(shí)例分析了基于C++實(shí)現(xiàn)加密解密的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • VisualStudio2022編寫(xiě)C語(yǔ)言的實(shí)現(xiàn)步驟

    VisualStudio2022編寫(xiě)C語(yǔ)言的實(shí)現(xiàn)步驟

    VisualStudio2022是一款強(qiáng)大的集成開(kāi)發(fā)環(huán)境,可以用來(lái)編寫(xiě)C語(yǔ)言程序,本文主要介紹了VisualStudio2022編寫(xiě)C語(yǔ)言的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • Qt6 QML實(shí)現(xiàn)DateTimePicker組件的示例代碼

    Qt6 QML實(shí)現(xiàn)DateTimePicker組件的示例代碼

    本文展示了基于Qt6.10實(shí)現(xiàn)的DateTimePicker時(shí)間日期選擇器組件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • 樹(shù)存儲(chǔ)結(jié)構(gòu)的幾種表示方法

    樹(shù)存儲(chǔ)結(jié)構(gòu)的幾種表示方法

    今天小編就為大家分享一篇關(guān)于樹(shù)存儲(chǔ)結(jié)構(gòu)的幾種表示方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03

最新評(píng)論

昔阳县| 佛学| 镇巴县| 驻马店市| 巴彦县| 扶沟县| 密云县| 奉化市| 萍乡市| 宽城| 元朗区| 呼伦贝尔市| 抚松县| 和田县| 措美县| 彰武县| 科技| 岢岚县| 石泉县| 玉树县| 凤山市| 洪雅县| 满城县| 永登县| 普安县| 海丰县| 左权县| 大足县| 佛坪县| 东乌珠穆沁旗| 徐州市| 镇坪县| 潮安县| 海盐县| 洪洞县| 儋州市| 游戏| 成武县| 凤翔县| 临朐县| 辛集市|