欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
STM32中的memcpy函數(shù)的使用
[打印本頁]
作者:
FredZhu
時間:
2020-8-24 19:57
標(biāo)題:
STM32中的memcpy函數(shù)的使用
1 簡述
最近在用JY61做一個傾角項目。剛好商家那里有個示例代碼有寫這個函數(shù)。正好給大家講下這個函數(shù)是怎么用的。
上面這個圖呢,是我從商家那里截取出來的。什么意思呢我下面給大家講下。
2 memcpy定義是什么?
memcpy 函數(shù)用于 把資源內(nèi)存(src所指向的內(nèi)存區(qū)域) 拷貝到目標(biāo)內(nèi)存(dest所指向的內(nèi)存區(qū)域);拷貝多少個?有一個size變量控制拷貝的字節(jié)數(shù);
函數(shù)原型:void *memcpy(void *dest, void *src, unsigned int count);
簡單來說呢就是把void *src內(nèi)的數(shù)據(jù)復(fù)制到void *dest里面。unsigned int count這個的意思就是說要從void *src復(fù)制多少個字節(jié)的數(shù)據(jù)到void *dest。
3 用法
可以拷貝任何類型的對象,因為函數(shù)的參數(shù)類型是void*(未定義類型指針),也就是說傳進(jìn)去的實參可以是int*,short*,char*等等,但是由于函數(shù)拷貝的過程是一個字節(jié)一個字節(jié)的拷貝的,所以實際操作的時候要把void*強(qiáng)制轉(zhuǎn)化為char*,這樣在指針加的時候才會保證每次加一個字節(jié)
4 實際應(yīng)用示例
[backcolor=inherit !important]void
*
[backcolor=inherit !important]memcpy1
[backcolor=inherit !important](
[backcolor=inherit !important]void
*
desc
[backcolor=inherit !important],
[backcolor=inherit !important]const
[backcolor=inherit !important]void
*
src
[backcolor=inherit !important],
size_t size
[backcolor=inherit !important])
[backcolor=inherit !important]{
[backcolor=inherit !important]if
[backcolor=inherit !important](
[backcolor=inherit !important](
desc
==
[backcolor=inherit !important]NULL
[backcolor=inherit !important])
&&
[backcolor=inherit !important](
src
==
[backcolor=inherit !important]NULL
[backcolor=inherit !important])
[backcolor=inherit !important])
[backcolor=inherit !important]//判斷desc和src是不是空的。
[backcolor=inherit !important]{
[backcolor=inherit !important]return
[backcolor=inherit !important]NULL
[backcolor=inherit !important];
[backcolor=inherit !important]}
[backcolor=inherit !important]unsigned
[backcolor=inherit !important]char
*
desc1
=
[backcolor=inherit !important](
[backcolor=inherit !important]unsigned
[backcolor=inherit !important]char
*
[backcolor=inherit !important])
desc
[backcolor=inherit !important];
[backcolor=inherit !important]unsigned
[backcolor=inherit !important]char
*
src1
=
[backcolor=inherit !important](
[backcolor=inherit !important]unsigned
[backcolor=inherit !important]char
*
[backcolor=inherit !important])
src
[backcolor=inherit !important];
[backcolor=inherit !important]while
[backcolor=inherit !important](
size
--
>
[backcolor=inherit !important]0
[backcolor=inherit !important])
[backcolor=inherit !important]{
*
desc1
=
*
src1
[backcolor=inherit !important];
desc1
++
[backcolor=inherit !important];
src1
++
[backcolor=inherit !important];
[backcolor=inherit !important]}
[backcolor=inherit !important]return
desc
[backcolor=inherit !important];
[backcolor=inherit !important]}
[backcolor=inherit !important]int
[backcolor=inherit !important]_tmain
[backcolor=inherit !important](
[backcolor=inherit !important]int
argc
[backcolor=inherit !important],
_TCHAR
*
argv
[backcolor=inherit !important][
[backcolor=inherit !important]]
[backcolor=inherit !important])
[backcolor=inherit !important]{
[backcolor=inherit !important]int
dest
[backcolor=inherit !important][
[backcolor=inherit !important]2
[backcolor=inherit !important]]
=
[backcolor=inherit !important]{
[backcolor=inherit !important]0
[backcolor=inherit !important]}
[backcolor=inherit !important];
[backcolor=inherit !important]const
[backcolor=inherit !important]char
src
[backcolor=inherit !important][
[backcolor=inherit !important]5
[backcolor=inherit !important]]
=
[backcolor=inherit !important]"1234"
[backcolor=inherit !important];
[backcolor=inherit !important]//printf(src);
[backcolor=inherit !important]memcpy1
[backcolor=inherit !important](
dest
[backcolor=inherit !important],
src
[backcolor=inherit !important],
[backcolor=inherit !important]sizeof
[backcolor=inherit !important](
src
[backcolor=inherit !important])
[backcolor=inherit !important])
[backcolor=inherit !important];
[backcolor=inherit !important]//*(dest+5) = '/0';
[backcolor=inherit !important]printf
[backcolor=inherit !important](
[backcolor=inherit !important](
[backcolor=inherit !important]char
*
[backcolor=inherit !important])
dest
[backcolor=inherit !important])
[backcolor=inherit !important];
[backcolor=inherit !important]int
m
=
-
[backcolor=inherit !important]1
[backcolor=inherit !important];
[backcolor=inherit !important]return
[backcolor=inherit !important]0
[backcolor=inherit !important];
[backcolor=inherit !important]}
5注意事項
(1)void* 一定要返回一個值(指針),這個和void不太一樣
(2)首先要判斷指針的值不能為空,desc為空的話肯定不能拷貝內(nèi)存空間,src為空相當(dāng)于 沒有拷貝;所以之間return掉;
(3)""空串是指內(nèi)容為0,NULL是0,不是串;兩個不等價;
(4)int dest[2] = {0};這是對int 類型的數(shù)組初始化的方法;如果是char類型,就用char a[5] = "1234"; 注意數(shù)組下標(biāo)要 多于實際看到的字符數(shù),因為還有'/0'
(5)printf((char *)dest);這句話,是把 char 類型 src 傳到 int 類型的 dest的內(nèi)存強(qiáng)制轉(zhuǎn)化成char類型,然后打印出來 因為直接看int類型的dest是看不到里面的內(nèi)容的;因為有unsigned char *desc1 = (unsigned char*)desc;所以字符可以傳到dest里面保存起來,dest所指向的內(nèi)存長度4個字節(jié),強(qiáng)制轉(zhuǎn)化為char 就是把四個字節(jié)分成一個一個的字節(jié),這樣就可以看到一個個字符了,如果定義成char dest[5] = "1234";就不用轉(zhuǎn)化;
(6)memcpy1(dest,src,sizeof(src));注意里面的sizeof(src),這個是包括字符串的結(jié)束符'/0'的;所以不用擔(dān)心printf(dest);但是如果用memcpy1(dest,src,4);沒有'/0'就要*(dest+5) = '/0';這樣保證是一個完整的字符串;
(7)如果初始化的時候:
char dest[1024] = "12345666";//{0};
const char src[5] = "3333";
那么拷貝的時候,如果用memcpy1(dest,src,sizeof(src));則printf(dest);出來是333; 如果memcpy1(dest,src,4);則printf(dest);出來是33335666;因為上面的sizeof(src),包含'/0',所以拷貝過去的字符串以'/0' 結(jié)束,就只有3333,而如果傳4個字符,'/0'是第五個字符,那就遇到dest[1024] 的'/0'結(jié)束,所以是33335666字符串的'/0'問題一定要注意啊!!!
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1