中常用的兩個函式memset 和memcpy

2022-05-13 01:02:51 字數 2448 閱讀 8336

是c++對c中的進行了重寫,這兩個標頭檔案中的函式用法是一樣的,所以在用的時候包含哪個標頭檔案都行。下面介紹一下

標頭檔案裡常用的兩個函式;分別是memset和memcpy。

1. memset(void* buffer,int a,size_t n);將buffer當前所指位置後面的n個位元組填充為a,注意memset是按位元組對記憶體塊進行填充的,所以只能

填充0或-1。buffer是乙個指標或者陣列名,a是int型資料,特別注意a只能是0或-1,n是記憶體的大小,即位元組數。一般用memset()來初始化陣列,

效率是比較高的,初始化後可以防止出現「野值」。例如現在有這樣乙個陣列:int a[10];要用0對陣列a進行填充,方法為:memset(a, 0, 10*sizeof(int)),

注意第三個引數了,不要搞錯。

另外再說一下,當buffer是靜態的時候,即buffer是陣列的話,第三個引數還可以寫成:sizeof(buffer),因為此時buffer是乙個陣列,有確定的記憶體大小,

所以在按照位元組填充的時候是沒有問題的;但是如果bufffer如果是動態的話,即buffer是乙個指標,第三個引數就不能像:sizeof(buffer)這樣寫了,只能

老老實實的寫成這個樣子:10*sizeof(int)。下面是我在標頭檔案中找到的memset()函式的原型:

2. memcpy(a, b, size_t n);把b當前所指位置之後的n個位元組中的資料複製到陣列a,和上面的memset()差不多,雖然它們的功能不同,但都是按照位元組進行操作的。

例如有兩個陣列:int a[5]=,b[4]=;現在要把a中的元素複製到b中:memcpy(b, a, 4*sizeof(int)),由於b的長度是4(即20個位元組),所以只能把a當前

所指位置之後的20個位元組的資料複製到b中,否則會越界。

還有一點要說一下,memcpy()還可以實現把乙個陣列中的元素複製到乙個vector容器中,此時第乙個引數為容器,但不能是容器名,第二個引數是數

組名;用這樣的形式:memcpy((int*) &a[0], b, size_t n);其中&a[0]代表容器a的首元素位址,而(int*)是memcpy()函式要求的。另外補充一下,陣列名即

int a[5]=;

vectorv(a,a+5);

即在宣告容器的時候可以直接指定複製,非常方便。下面附上兩個函式的使用**及結果

1 #include2 #include3 #include4

using

namespace

std;

5int

main()6;

8int b[4]=;

910 cout<

把陣列a複製到陣列b中後,b中元素為:";

11 memcpy(b,a+1,4*sizeof(int)); //

從a+1開始,把陣列a複製到陣列b中,複製20個位元組的資料

12for(int i=0;i<4;i++) //

a和b所指位置是可以修改的,即a的複製區間是可以改變的,存放到b中的起始位置也是可以改變的

13 cout

1415 vector v1(a,a+5); //

必須先初始化v1,並且v1的長度不小於a的長度,否則複製的時候會越界

16 cout<

\n把陣列a複製到容器v1中後,v1中元素為:";

17for(int i=0;i)

18 cout

1920 memset(a,0,5*sizeof(int)); //

分別用0和-1填充陣列a

21 cout<

\n用0填充陣列a:";

22for(int i=0;i<5;i++)

23 cout

24 cout<

\n用-1填充陣列a:";

25 memset(a,-1,5*sizeof(int

));26

for(int i=0;i<5;i++)

27 cout

28 cout<

\n用1填充陣列b:";

29 memset(b,1,4*sizeof(int)); //

用0和-1以外的數填充會產生非法值

兩個常用的非常有用excel函式

list 查詢函式 vlookup lookup value,array,columindexnum,ranglookup list 有如圖所示資料,我們要查詢相對a1的c1 vlookup a1,a1 c6,3,false 結果為c1.a1是我們要查詢的值。a1 c6,查詢的範圍。3,相對於a1偏...

exit 和 exit 兩個函式的區別

exit 和 exit 這兩個函式都是用於函式退出,但這兩者有一些細微的差別,在exit 函式裡會呼叫 exit 函式。下面來看看exit 的函式 大概 void exit int status exit status 其中 exit funcs是儲存由 cxa atexit和atexit註冊的函式...

exit 和 exit 兩個函式的區別

exit 和 exit 這兩個函式都是用於函式退出,但這兩者有一些細微的差別,在exit 函式裡會呼叫 exit 函式。下面來看看exit 的函式 大概 void exit int status exit status 其中 exit funcs是儲存由 cxa atexit和atexit註冊的函式...