轉載:http://blog.csdn.net/u011118276/article/details/46742341
1、memcpy
頭文件:#include <string.h>
函數原型:void *memcpy(void *dest, const void *src, size_t n)
功能:將指針src指向的內存空間的n個字節復制到dest指針指向的內存空間
參數:src 為原內容內存的起始地址,dest為復制到目標地址的起始地址
返回值:目標dest內存的起始地址
注意:1、內存空間不能夠有重疊;
? ?2、memcpy對于需要復制的內容沒有限制,因此用途更廣;
? ? ? 3、很明確的是memcpy是將 n個字節, ?雖然memcpy對復制的內容完全沒有任何的限制,比如數組,結構體等特殊的結構,如果你想將整個結構體變量的內容復制到dest內存區,最好使用sizeof將要復制的內容的完整大小求出來賦值給n,以保持復制的完整性;
c代碼:
- void?*memCpy(void?*dest,?const?void?*src,?size_t?n)??
- {??
- ????if?(NULL?==?dest?||?NULL?==?src?||?n?<?0)??
- ????????return?NULL;??
- ????char?*tempDest?=?(char?*)dest;??
- ????char?*tempSrc?=?(char?*)src;??
- ??
- ????while?(n--?>?0)??
- ????????*tempDest++?=?*tempSrc++;??
- ????return?dest;??????
- }??
2、memset
頭文件:#include <string.h>
函數原型:void *memset(void *s, int c, size_t n)
功能:以s為起始位置的n個字節的內存區域用整數c進行填充
參數:s為內存區域的起始位置,c為要填充的字符,n為要填充多少個字節
返回值:目標s內存的起始地址
注意:1、n表示的是字節數,函數是以字節的形式每次賦值給目標地址;
? ? ? 2、memset函數也是以字節為單位進行賦值的,所以要想在整形數組中給每一位賦確定的非0值,一般來講是不可行的;(下方將有對此說明測試的程序)
c代碼:
- void?*memSet(void?*s,?int?c,?size_t?n)??
- {??
- ????if?(NULL?==?s?||?n?<?0)??
- ????????return?NULL;??
- ????char?*?tmpS?=?(char?*)s;??
- ????while(n--?>?0)??
- ????????*tmpS++?=?c;??
- ????????return?s;???
- }??
下面是針對注意事項的測試程序:
- #include?<stdio.h>??
- #include?<string.h>??
- void?*memSet(void?*s,?int?c,?size_t?n)??
- {??
- ????if?(NULL?==?s?||?n?<?0)??
- ????????return?NULL;??
- ????char?*?tmpS?=?(char?*)s;??
- ????while(n--?>?0)??
- ????????*tmpS++?=?c;??
- ????return?s;???
- }??
- int?main()??
- {??
- ????int?buf[10];??
- ????int?i;??
- ????printf("%d\n",?sizeof?buf);??
- ????for?(i?=?0;?i?<?10;?i++)??
- ????????printf("buf[%d]?=?%d\n",?i,?buf[i]);??
- ????printf("------------------------------------\n");??
- ????memSet(buf,?1,?sizeof(buf));??
- ????for?(i?=?0;?i?<?10;?i++)??
- ????????printf("buf[%d]?=?%d\n",?i,?buf[i]);??
- ????return?0;??
- }??
結果:

結果分析:可以看出得出的結果并沒有得到想要的1,而得出不知道是什么的東西;
1的二進制表示是:0000 0000 0000 0000 0000 0000 0000 0001
memset函數也是以字節為單位進行賦值的,指針每次只會向后移動一個字節,依此將值賦給每次的地址中,直到n = 0;
最后在四個字節中賦值的結果為:0000 0001?0000 0001?0000 0001?0000 0001?
十進制顯示就為:16843009
當把數組改成char buf[10]時,顯示的結果如下:(更加證明是以字節方式賦值)
