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

C語言進階之內(nèi)存操作函數(shù)詳解

 更新時間:2023年07月26日 16:49:48   作者:灰灰快醒醒  
這篇文章主要為大家學習介紹了C語言中內(nèi)存操作函數(shù)(memcpy、memmove和memcmp)的使用,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下

內(nèi)存操作函數(shù)

memcpy

頭文件:string.h

基本用途:進行不相關(不重疊的內(nèi)存)拷貝。

函數(shù)原型:

void* memcpy(void* destination,//指向目標數(shù)據(jù)的指針
const void* source,//指向被拷貝數(shù)據(jù)的指針
size_t num);//拷貝的數(shù)量(單位:字節(jié))

注:

1.基本原理:從source的位置開始向后復制num個字節(jié)的數(shù)據(jù)到destnation的內(nèi)存位置。

2.這個函數(shù)與strcpy不同,它遇見'\0'的時候并不會停下來。

3.如果source和destnation有任何的重疊,復制的結(jié)果都是未定義的。

4.void* 之前講過,為了保證泛用性,使用void*接收任意類型的數(shù)據(jù)。

使用舉例:

#include <stdio.h>
#include <string.h>
struct {
	char name[40];
	int age;
}person, person_copy;
int main()
{
	char myname[] = "Pierre de Fermat";
	memcpy(person.name, myname, strlen(myname) + 1);
	person.age = 46;
	memcpy(&person_copy, &person, sizeof(person));
	printf("person_copy: %s , %d\n", person_copy.name, person_copy.age);
	return 0;
}

這是將字符串和結(jié)構體成員變量拷貝到另一個結(jié)構體的舉例。

為了更好的理解這一函數(shù),下面我們來模擬實現(xiàn)一下它。

void* my_memcpy(void* dest, const void* src, size_t num)
{
	//斷言,防止dest或者src是空指針,如果是空指針則會報錯
	assert(dest && src);
	//保存起始地址
	void* ret = dest;
	while (num--)
	{
		//一次用最小單位(字節(jié))移動,保證泛用性
		*(char*)dest = *(char*)src;
		//注:強制類型轉(zhuǎn)換只是臨時的,后面+1操作時已不存在
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	//返回目標空間的起始地址
	return ret;
}

memmove

頭文件:string.h

基本用途:重疊內(nèi)存塊的拷貝。

函數(shù)原型:

void* memove(void* destnation, const void* source, size_t num)

注:

1.和memcpy的區(qū)別就是memove函數(shù)處理的源內(nèi)存塊和目標內(nèi)存塊可以重疊。

2.如果原空間和目標空間出現(xiàn)重疊,就得使用memmove函數(shù)處理。

使用舉例:

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "memmove can be very useful.....................";
	//將字符串中從第15個元素的位置向后數(shù)共11個字符挪到從第20個字符開始向后數(shù)第11個元素
	memmove(str + 20, str + 15, 11);
	puts(str);
	return 0;
}

該函數(shù)的模擬實現(xiàn):

#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	//當目標位置地址小于源內(nèi)存塊數(shù)據(jù)地址時,采用從前向后拷貝的方式
	if (dest < src)
	{
		//根據(jù)字節(jié)數(shù)量一個一個移動內(nèi)存單元
		while (num--)
		{
			*(char*)dest = *(char*)src;
			//向后移動一位
			dest = (char*)dest + 1;
			src = (char*)dest + 1;
		}
	}
	//當目標為指針大于源內(nèi)存塊數(shù)據(jù)地址時,采用從后向前的拷貝方式
	else if (dest > src)
	{
		//將dest和src指針定位到各自最后的內(nèi)存地址處
		dest = (char*)dest + num - 1;
		src = (char*)src + num - 1;
		//根據(jù)字節(jié)數(shù)量一個一個移動內(nèi)存單元
		while (num--)
		{
			*(char*)dest = *(char*)src;
			//向前移動一位
			dest = (char*)dest - 1;
			src = (char*)src - 1;
		}
	}
}

memcmp

頭文件:stdio.h

基本用途:顧名思義,與strcmp函數(shù)類似,這個函數(shù)是比較內(nèi)存數(shù)據(jù)大小的(逐字節(jié))。

函數(shù)原型:

int memcmp(const void* ptr1, const void* ptr2, size_t num);

注:

1.比較從ptr1和ptr2開始的num個字節(jié)

2.與strcmp返回值類似,仍是第一個指針內(nèi)容大于第二個指針的內(nèi)容,返回大于零的數(shù)字,第一個指針內(nèi)容小于第二個指針的內(nèi)容,返回小于零的數(shù)字,相等,返回零。

基本舉例:

#include <stdio.h>
#include <string.h>
int main()
{
	char buffer1[] = "axxxxxxxxxxx";
	char buffer2[] = "bbbbbbbbbbbb";
	int n;
	n = memcmp(buffer1, buffer2, sizeof(buffer1));
	printf("%d", n);
	return 0;
}

結(jié)果:

到此這篇關于C語言進階之內(nèi)存操作函數(shù)詳解的文章就介紹到這了,更多相關C語言內(nèi)存操作函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • C/C++實現(xiàn)監(jiān)控目錄文件變化

    C/C++實現(xiàn)監(jiān)控目錄文件變化

    ReadDirectoryChangesW是Windows操作系統(tǒng)提供的一個函數(shù),用于監(jiān)視目錄的變化,本文主要為大家介紹了如何使用ReadDirectoryChangesW實現(xiàn)監(jiān)控目錄文件變化,需要的可以參考下
    2023-11-11
  • C語言深入淺出解析二叉樹

    C語言深入淺出解析二叉樹

    二叉樹可以簡單理解為對于一個節(jié)點來說,最多擁有一個上級節(jié)點,同時最多具備左右兩個下級節(jié)點的數(shù)據(jù)結(jié)構。本文將詳細介紹一下C++中二叉樹的實現(xiàn)和遍歷,需要的可以參考一下
    2022-03-03
  • VC讀配置文件實例

    VC讀配置文件實例

    這篇文章主要介紹了VC讀配置文件的方法,實例講述了VC針對文件操作的技巧,需要的朋友可以參考下
    2014-10-10
  • OpenCV4 實現(xiàn)背景分離的詳細步驟(背景減法模型)

    OpenCV4 實現(xiàn)背景分離的詳細步驟(背景減法模型)

    背景分離(BS)是一種通過使用靜態(tài)相機來生成前景掩碼(即包含屬于場景中的移動對象像素的二進制圖像)的常用技術,本文給大家介紹OpenCV4 實現(xiàn)背景分離的詳細步驟,需要的朋友可以參考下
    2021-09-09
  • 關于C++11中限定作用域的枚舉類型的問題

    關于C++11中限定作用域的枚舉類型的問題

    C++中有兩種類型的枚舉:不限定作用域的枚舉類型和限定作用域的枚舉類型。限定作用域的枚舉類型是C++11標準引入的新類型,對C++11中限定作用域的枚舉類型相關知識感興趣的朋友一起看看吧
    2022-01-01
  • C++結(jié)構體數(shù)組實現(xiàn)貪吃蛇

    C++結(jié)構體數(shù)組實現(xiàn)貪吃蛇

    這篇文章主要為大家詳細介紹了C++結(jié)構體數(shù)組實現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 基于QT實現(xiàn)自定義溫度計的示例代碼

    基于QT實現(xiàn)自定義溫度計的示例代碼

    QT原生控件沒有實現(xiàn)如儀表盤或者溫度計的控件,只好自己實現(xiàn),所以本文為大家介紹了如何利用qt實現(xiàn)自定義溫度/濕度控件,感興趣的小伙伴可以了解下
    2023-11-11
  • C++與Qt的內(nèi)存管理機制詳解

    C++與Qt的內(nèi)存管理機制詳解

    這篇文章主要介紹了C++與Qt的內(nèi)存管理機制使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • C++回調(diào)函數(shù)實現(xiàn)計算器和qsort

    C++回調(diào)函數(shù)實現(xiàn)計算器和qsort

    這篇文章主要介紹了C++回調(diào)函數(shù)實現(xiàn)計算器和qsort,回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)
    2022-08-08
  • c++矩陣計算性能對比:Eigen和GPU解讀

    c++矩陣計算性能對比:Eigen和GPU解讀

    這篇文章主要介紹了c++矩陣計算性能對比:Eigen和GPU解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評論

文成县| 新泰市| 依兰县| 新营市| 临颍县| 丽江市| 佛坪县| 论坛| 平遥县| 昂仁县| 陆川县| 读书| 隆昌县| 陇南市| 道孚县| 青河县| 金寨县| 伊吾县| 石门县| 巴林右旗| 石屏县| 巩义市| 乾安县| 娄烦县| 聂拉木县| 岗巴县| 建宁县| 阳曲县| 嘉义市| 盖州市| 彭水| 大关县| 安远县| 黎城县| 庆城县| 利辛县| 天祝| 进贤县| 迭部县| 玉环县| 乌兰浩特市|