1. 程式人生 > >C/C++陣列初始化的總結

C/C++陣列初始化的總結

目錄

陣列定義不初始化會被隨機賦值

陣列初始化的幾種形式

陣列初始化為某一固定值

memset(陣列名,值,sizeof(陣列名))

fill(begin(),end(),value)


以前剛開始學陣列初始化,一直都沒搞太清楚,包括參加PAT考試,直到看了胡凡的《演算法筆記》,逐漸清晰,是這樣的:

  • 陣列定義不初始化會被隨機賦值

因此如果陣列的所有元素在下面沒有逐一賦值,但是又會使用到的話,最後不要只定義而不初始化。會帶來問題。

  • 陣列初始化的幾種形式

  1. 可以直接用{}:a[10]={},就可以讓a[10]陣列中的所有元素全為0;
  2. 也可以{}內包含0:a[10]={},也可以讓a[10]陣列中的所有元素全為0;
  3. {}內寫一個值只會讓第一個元素為這個值,後面的依舊是0:a[3]={5},陣列實際上被初始化為{5,0,0}
  • 陣列初始化為某一固定值

可以將陣列初始化為某一固定值。有兩種方法,一種是使用<string>(C++)或<string.h>(C)中的memset()函式,還有一種是使用<algorithm>中的fill()函式,fill函式可以初始化容器和陣列。

  • memset(陣列名,值,sizeof(陣列名))

只建議使用memset()的時候初始化為0或者-1。menset()函式的功能性不如fill()函式,其優點在於執行速度更快。

程式例項:

#include <stdio.h>
int main(){
    int a[10];
    memset(a,5,sizeof(a));
    for(int i=0;i<10;i++)
        printf("%d",a[i]);
    return 0;
}

//output:5555555555
  • fill(begin(),end(),value)

fill()可以把陣列和容器中的某一段區間賦值為某個相同的值。和memset()不同的是這裡的賦值可以是陣列型別對應範圍中的任意值。

程式例項:

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
    int a[10];
    fill(a,a+5,233);
    for(int i=0;i<10;i++)
        cout<<a[i]<<" ";
    return 0;
}

/*
233 233 233 233 233 0 31 0 0 0
--------------------------------
Process exited after 0.4914 seconds with return value 0
請按任意鍵繼續. . .
*/

從這裡也可以看出,a[]後面的元素是隨機賦值的。

建議採用fill()而不是使用memset()。