国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語言學習系列-->一篇帶你看懂內(nèi)存函數(shù)

這篇具有很好參考價值的文章主要介紹了C語言學習系列-->一篇帶你看懂內(nèi)存函數(shù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


C語言學習系列-->一篇帶你看懂內(nèi)存函數(shù),c語言,學習,開發(fā)語言

前言

上篇文章學習了C語言字符串函數(shù),只是對字符串進行操作
本節(jié),小編整理了一下C語言中的內(nèi)存函數(shù),對內(nèi)存進行操作,只針對會內(nèi)存塊,不針對數(shù)據(jù)

memcpy

概述

void * memcpy ( void * destination, const void * source, size_t num );

memcpy是對內(nèi)存拷貝

拷貝的可能是字符串,也可能是整型數(shù)組

所以使用 void*

將source拷貝到destination,指定字節(jié)數(shù)為num

code

#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;
}

arr2是dest,arr1是scr,20是怒num,即字節(jié)

將arr1中的前20個字節(jié)(即1,2,3,4,5)復(fù)制到arr2中

運行結(jié)果

1 2 3 4 5 0 0 0 0 0

模擬實現(xiàn)

#include <stdio.h>
#include <string.h>
#include<assert.h>

void* my_memcpy(void* dest,const void* src, size_t num)
{
	void* ret = dest;    //后面dest的地址可能會發(fā)生改變,因此先將dest的首地址存放在ret中
	assert(dest && src);
	while (num--)
	{
		*(char*) dest = *(char*)src;   //viod*型不能解引用,所以先強制類型轉(zhuǎn)換成char*型,再解引用
		dest = (char*)dest+1;
		src = (char*)src+1;
	}
}

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;
}

對于重疊的內(nèi)存,交給memmove來處理

其實在vs中,memcpy庫函數(shù)也可以處理重疊內(nèi)存,但是在其他編譯器不一定可以,不通用

memmove

概述

void * memmove ( void * destination, const void * source, size_t num );

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

將1 2 3 4 5拷貝到3 4 5 6 7的位置上

即,最終結(jié)果為,1 2 1 2 3 4 5 8 9 10
C語言學習系列-->一篇帶你看懂內(nèi)存函數(shù),c語言,學習,開發(fā)語言

code

#include <stdio.h>
#include <string.h>
#include<assert.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;
}

輸出結(jié)果

1 2 1 2 3 4 5 8 9 10

模擬實現(xiàn)

前面我們看到,

將1 2 3 4 5拷貝到3 4 5 6 7的位置上

C語言學習系列-->一篇帶你看懂內(nèi)存函數(shù),c語言,學習,開發(fā)語言

實際上應(yīng)該是

將5放到7的位置
將4放到6的位置
將3放到5的位置
將4放到4的位置
將3放到3的位置

是后—>前

如果,先將1放到3的位置,那么3這個位置就變成1。再將2放到4的位置,此時最終結(jié)果就變成了1 2 1 2 1 2 1 8 9 10

再來看看這種情況:

C語言學習系列-->一篇帶你看懂內(nèi)存函數(shù),c語言,學習,開發(fā)語言
將5 6 7 8 9拷貝到3 4 5 6 7的位置上

將5放到3的位置上
將6放到4的位置上
(此時原本5 6位置上就沒有數(shù)字了)
將7放到5的位置
將8放到6的位置
將9放到7的位置

是前—>后

C語言學習系列-->一篇帶你看懂內(nèi)存函數(shù),c語言,學習,開發(fā)語言
因此,
if(dest<src):前—>后
else:后—>前

模擬code

#include <stdio.h>
#include <string.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	assert(src);

	//分情況討論
	if (dest < src)
	{
		//前->后
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		//后->前
		while (num--)
		{
			//num=18
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr1, arr1+2, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}

	return 0;
}

輸出結(jié)果

3 4 5 6 7 6 7 8 9 10

memset

memory set 記憶設(shè)置,即內(nèi)存設(shè)置

void * memset ( void * ptr, int value, size_t num );

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

code

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "hello world";
	memset(str, 'x', 6);
	printf(str);
	return 0;
}

注意點:memset是以字節(jié)為單位設(shè)置內(nèi)存值的

輸出結(jié)果

xxxxxxworld

memcmp

和strcmp功能其實差不多

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

?較從ptr1和ptr2指針指向的位置開始,向后的num個字節(jié)

code

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abqwertyuiop";
	int ret = memcmp(arr1, arr2, 2);
	printf("%d\n", ret);

	return 0;
}

輸出結(jié)果

0

總結(jié)

小編看來,內(nèi)存函數(shù)和字符串函數(shù)有很多相似的地方,只不過內(nèi)存函數(shù)針對的內(nèi)存塊罷了。
下一篇更新:數(shù)據(jù)在內(nèi)存中的儲存

C語言學習系列-->一篇帶你看懂內(nèi)存函數(shù),c語言,學習,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-708157.html

到了這里,關(guān)于C語言學習系列-->一篇帶你看懂內(nèi)存函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • GRBL源碼詳解步進電機的算法學習筆記(STM32)一篇帶你學完GRBL算法初版

    GRBL源碼詳解步進電機的算法學習筆記(STM32)一篇帶你學完GRBL算法初版

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 GRBL源碼中步進電機的算法學習筆記(STM32) GRBL源碼中算法部分的學習是我在公司研發(fā)激光切割機(三軸)期間研究的一套關(guān)于步進電機驅(qū)動控制的常見算法,以下內(nèi)容都以激光切割機來舉例,話不多說

    2024年02月04日
    瀏覽(22)
  • 一篇帶你精通MPLS

    一篇帶你精通MPLS

    MPLS:多協(xié)議標簽交換 可以基于多種不同的3層協(xié)議來生成2.5層的標簽信息 包為網(wǎng)絡(luò)層的PDU,故包交換就是基于IP地址進行數(shù)據(jù)轉(zhuǎn)發(fā);也就是路由器的路由行為。(路由器和終端基于3層的IP地址數(shù)據(jù)轉(zhuǎn)發(fā)的路由行為) 原始包交換 查兩張表 在包交換過程中,數(shù)據(jù)包每經(jīng)過一個路

    2024年02月22日
    瀏覽(28)
  • 數(shù)組(一篇帶你掌握數(shù)組)

    數(shù)組(一篇帶你掌握數(shù)組)

    ? ? 在之前,我們想要存儲一個數(shù)據(jù)的時候可以創(chuàng)建變量,例如存儲一個整形的變量,我們使用int類型的變量來存儲,那么如果存儲一組相同類型的數(shù)據(jù)呢?這時我們就引入了 數(shù)組 的概念。 目錄 一、一維數(shù)組的創(chuàng)建和初始化 1.1數(shù)組的創(chuàng)建 1.2 數(shù)組的初始化 1.3 一維數(shù)組的使

    2023年04月08日
    瀏覽(20)
  • Javaの一篇帶你吃透接口

    Javaの一篇帶你吃透接口

    隨著接口的到來,JavaSE的學習筆記大結(jié)局也即將來臨,最近的幾篇博客寫到了封裝,繼承,多態(tài),抽象類等等,都循序漸進得介紹了這類的知識,大家如果接口這一塊理解的很困難的話,建議去完善一下前面的知識哦 ??Java封裝 ??靜態(tài)成員 ??代碼塊 ??內(nèi)部類 ??繼承 ??多

    2023年04月08日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)】一篇帶你徹底了解棧

    【數(shù)據(jù)結(jié)構(gòu)】一篇帶你徹底了解棧

    棧:一種線性數(shù)據(jù)結(jié)構(gòu),其只允許在固定的一端進行插入和刪除元素操作。進行數(shù)據(jù)插入和刪除操作的一端稱為棧頂 (Top), 另一端稱為棧底 [Bottom]。棧中的數(shù)據(jù)元素遵守后進先出LIFO(Last In First Out)的原則。即最后進入的元素最先被訪問。 壓棧:棧的插入操作叫做進棧/壓棧

    2024年02月05日
    瀏覽(26)
  • 【Python】一篇帶你掌握數(shù)據(jù)容器之列表

    【Python】一篇帶你掌握數(shù)據(jù)容器之列表

    目錄 前言: 一、列表 1.列表的定義 2.列表的下標索引 3.列表的常用操作 (1)index方法:查找某元素的下標 (2)修改特定位置下標的元素 (3)insert(下標,元素)方法:插入元素 (4)append(元素)方法:追加元素1 (5)extend(其他數(shù)據(jù)容器)方法:追加元素2 (6)del(列表

    2024年02月05日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)】一篇帶你徹底吃透 順序表

    順序表是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲。在數(shù)組上完成數(shù)據(jù)的增刪查改等功能。 順序表一般可以分為: 靜態(tài)順序表:使用定長數(shù)組存儲元素。 動態(tài)順序表:使用動態(tài)開辟的數(shù)組存儲。 而現(xiàn)實的順序表大多數(shù)采用動態(tài)

    2023年04月19日
    瀏覽(27)
  • [Linux 基礎(chǔ)] 一篇帶你了解linux權(quán)限問題

    [Linux 基礎(chǔ)] 一篇帶你了解linux權(quán)限問題

    Linux下有兩種用戶:超級用戶(root)、普通用戶。 超級用戶:可以再linux系統(tǒng)下做任何事情,不受限制 普通用戶:在linux下做有限的事情。 超級用戶的命令提示符是“#”,普通用戶的命令提示符是“ $ ” 命令: su [用戶名] 功能: 切換用戶。 例如,要從root用戶切換到普通用

    2024年02月08日
    瀏覽(21)
  • Linux - 一篇帶你讀懂 Curl Proxy 代理模式

    Linux - 一篇帶你讀懂 Curl Proxy 代理模式

    curl 是一個很有名的處理網(wǎng)絡(luò)請求的 類Unix 工具。出于某種原因,我們進行網(wǎng)絡(luò)請求,需要設(shè)置代理。本文講全面介紹如何為 curl 設(shè)置代理 設(shè)置代理參數(shù) 基本用法 設(shè)置 HTTP 代理 下面兩種設(shè)置代理的方式是可以的 由于代理地址的默認協(xié)議為? HTTP, 所以可以省略,按照下面的

    2024年02月05日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包