C 陣列的初始化規則

2022-09-08 15:06:14 字數 1542 閱讀 5199

c++有幾條關於初始化陣列的規則,它們限制了初始化的時刻,決定了陣列的元素數目與初始化器中值的數目不相同時將發生的情況。

只有在定義陣列時才能使用初始化,此後就不能使用了,也不能將乙個陣列賦給另乙個陣列:

int cards[4] = ; //okay

int hand [4]; //okay

hand[4] = ;   //not allowed

hand = cards;   //not allowed

然而,可以使用下標分別給陣列中的元素賦值。

初始化十足十,提供的值可以少於陣列的元素數目。例如,下面的語句值初始化hoteltips的前兩個元素:

float hoteltips[5] = ;

如果只對陣列的一部分進行初始化,則編譯器將把其他元素設定為0。因此,將陣列中所有的元素都初始化為0非常簡單——只要顯示的將第乙個元素初始化為0,然後讓編譯器將其他元素都初始化為0即可:

long total[500] = ;

如果初始化為而不是,則第乙個元素被設定為1,其他元素都被設定為0。

如果初始化陣列時方括號([ ])為空,c++編譯器將計算元素個數。例如,對於下面的宣告:

short things = ;

編譯器將使things陣列包含4個元素。

讓編譯器去做

通常,讓編譯器計算元素個數是種很糟的做法,因為其計數可能與您想象的不一樣。例如,您可能不小心在列表中遺漏了乙個值。然而,這種方法對於將字元陣列初始化為乙個字串來說比較安全,很快你將明白這一點。如果主要關心的問題時程式,而不是自己是否知道陣列的大小,則可以這樣做:

short things = ;

int num_elements = sizeofthings / sizeof (short);

這樣做是有用還是偷懶取決於具體情況。

c++11陣列的初始化方法

首先,初始化陣列時,可省略(=)

double earning[4] ;   //okay with  c++11

其次,可不在大括號內包含任何東西,這將把所有元素都設定為零:

unsigned int counts[10] = {};  // all elements set to 0

float balances[100] {};    //all elements set to 0

第三,列表初始化禁止縮窄轉換:

long plifs = ;    //not allowed

char slifs[4] ;  // not allowed

char tlifs[4] ;

在上述**中,第一條語句不能通過編譯,因為浮點數轉換為整型是縮窄操作,即使浮點的小數點後面為0。第二條語句也不能通過編譯,因為1122011超出了char變數的取值範圍(這裡假設char變數的長度為8位)。第三條語句可通過編譯,因為雖然112是乙個int值,但它在char變數的取值內。

c++標準模板庫(stl)提供了一種陣列代替品——模板類vector,而c++11新增了模板類array。這些替代品比內建復合型別陣列更複雜,更靈活。

c 變數初始化規則

include include include include include using namespace std define num 10000 class bclass 對於常量型成員變數和引用型成員變數,必須通過引數化列表的方式進行初始化 普通成員變數也可以放在函式體裡,但是本質其實已不...

C 變數初始化規則

1 定義變數的時候,如果沒有初始化,它的值是什麼呢?它的值取決於變數的型別和變數定義的位置。2 考慮基本型別的變數,定義時沒有初始化。如果定義在方法外部,初始化為0,如果定義在方法內部,不被初始化。使用未初始化的變數,導致未定義行為。未初始化的變數事實上,也有乙個值,這個值是隨機的。因此強烈建議,基...

C 陣列初始化

定義 int pia new int 10 array of 10 uninitialized ints 此 new 表示式分配了乙個含有 10 個 int 型元素的陣列,並返回指向該陣列第乙個元素的指標,此返回值初始化了指標 pia。在自由儲存區中建立的陣列物件是沒有名字的,只能通過其位址間接地訪...