陣列初始化及賦值的方法,memset的使用
1. 陣列初始化:
即定義時即賦值:
int a[4]={0}; //每一個位置的int都為0
int b[4]={1}; //只有第一個元素為1,其他都為0
所以要想把陣列初始化為其他值,則需要一個個的指定值: int b[4]={1,2,3,4};//比如指定為1,2,3,4
或者先統一初始化為0,再利用for迴圈改變陣列的每一個元素。
2. 陣列的賦值:
在定義過後,需要給陣列每一個元素賦值時,不能再像初始化那樣:
a[4] = {1,3,5,7}; //這是錯誤的,
a={1,3,5,7};//這還是錯的。
只能利用for迴圈,或者利用memcpy從其他記憶體拷貝一份值過來。
當使用完成後,區域性陣列會由函式自動釋放,全域性陣列則需進行下清零。
這時候就要用到memset函式。
memset(a,0,sizeof(a));
或者memset(a,0,sizeof(int)*4); //sizeof取的是位元組。 memset是按位元組進行賦值的,這裡為16個位元組:4*4
3. memset函式:memset(void *s, int ch,size_t n); // C語言:#include <string.h> 或者 C++: #include <cstring>
一般只用來清零,或者初始化區域性陣列為0,以免出現區域性陣列的每一個元素為亂值。所以第二個引數一般為0或者-1.
要注意:
3.1 memset是按位元組進行賦值,
所以假設你想利用memset給a陣列每一位置為1,memset(a,1,sizeof(a)); // 這時候你去列印a的每一位,值都是16843009,而非你期望的1
原因:int為四個位元組,這時候每個位元組被memset置為1,而每一個元素都是一個int,即 01 01 01 01,讀取十六進位制為 0x01010101,十進位制為 16843009
不過 char型別的可以使用memset隨意賦值為自己想要的,因為 char只佔一個位元組,賦多少就是多少。
e.g.:
char a[3]={'a' , 'b', 'c'};
memset(a, 1,sizeof(a));
for(int i=0;i<sizeof(a)/sizeof(a[0]);i++){
printf("a[%u]=[%u]\n",i,a[i]); //得到a[1]=1; a[2]=1; a[3]=1;
}