陣列初始化

2022-06-04 03:42:06 字數 4261 閱讀 6309

在c++中,乙個變數或陣列變數定義完成後,其值均為系統預設,不一定是我們想要的。一般情況下,全域性變數或陣列系統會自動初始化(整數一般為0,布林型為false,字元型為\0),而區域性變數則為隨機。特別是陣列變數,我們在使用中一定義可能就是很大數量的變數,系統預設的可能非我們想要的,那就存在陣列變數的統一初始化了。如何初始化陣列變數?

一、在陣列定義時直接賦值

例1:int a[5]=;這樣陣列的每乙個值都確定了,a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5。

當然這種方法賦值很明確,但也很麻煩,特別是陣列但很大時不太實用。如果給出值的個數超過定義個數,有的系統會報錯,有的系統則不會,但多出的值將會被忽略。例如int a[5]=;如果不報錯則等效於int a[5]=;,但一般會有警告。若末尾多乙個逗號,一般不會報錯,好個逗號會被忽略。

例2:在賦值時我們也可以採用省略形式。例1中寫法也可以省略為int a=;

這種寫法沒指定元素個數,那系統將根據我們提供的值的個數來確定定義的元素個數。如上例中就定義了5個元素,並完成賦值。同上,如果最後有乙個逗號,一般會被忽略,不會計數。例如int a=;其作用跟int a=;一樣。但若中間多逗號,例如int a=;則會報錯。

例3:我們還可以採用部分賦值法。如int a[10]=;

我們定義了10個元素,但我們只給了三個值,這樣得到的結果是a[0]=1,a[1]=2,a[3]=3,其餘元素的值全為0。

當然,我們也可以有乙個極限寫法int a[10]={};乙個值沒指定,也可以理解為指定了0個元素的值,其餘元素的值全為0,即是全部元素值為0。

其他型別陣列省略部分資料的值請參照全域性變數預設。

例4:二維陣列的可以看作多個一維陣列,故可採用逐維賦值法。如int a[4][3]=,,,},其結果應該不難理解,

a[0][0]=1,a[0][1]=2,a[0][2]=3,a[1][0]=4,a[1][1]=5,a[1][2]=6,a[2][0]=7,a[2][1]=8,a[2][2]=9,a[3][0]=10,a[3][1]=20,a[3][2]=30

例5:二維陣列的逐維賦值法也可以採用省略形式,如int a[4][3]=,,,},其結果跟int a[4][3]=,,,}效果一樣。

例6:二維陣列也可以採用一維賦值相同的方法,二維陣列的資料儲存一般採用行優先原則,如例4中各元素在記憶體中會依次存放數值1-10,20,30。根據這一規律,我們也可以定義為int a[4][3]=,其效果跟例4一樣。當然,這個也可以採用省略形式,如果提供的數值個數不夠,後面的自動補0。如果提供的數值個數超出定義的個數,將會報錯。(這時所說定義個數指兩個維度乘積,如a[4][3]就定義了12個數)

例7:二維陣列的第乙個維度有時也可以省略,如int a[3]=,其效果跟例4一樣,當然如果所提供個數不是第二維度個數的整數倍,則系統會自動補0,如int a[3]=將會等效於int a[4][3]=

。注意,第二個維度不可省略,如定義為int a[4]=就會報錯。(二維陣列採用行優先原則,每一行元素個數不確定,就不能確定何時進入第二行)

二、利用全域性變數自動初始化

在c++中,我們的陣列定義大多在全域性,這樣,陣列會自動初始化,而且可用空間更大(區域性定義陣列範圍太大,容易爆棧--這一說法我也沒找到官方說明,在是其他博文中看到,如有不妥請大家指正)。

三、用fill函式初始化(需加標頭檔案,我用的ide是dev,不加標頭檔案也可以執行,其他ide或評測系統未測試)

基本用法:fill(開始位址,結束位址,值);

這裡的開始位址和結束位址一般用陣列名代表首位址,陣列名+偏移量來表示結束位址。

例1:int a[10];     fill(a,a+10,1);這樣就把資料中10個元素的值均賦值為1。

例2:int a[10];   fill(a+1,a+9,2);這樣就把陣列中第2到9個元素的值賦值為2,其他元素的值未改變。(如果定義部分在全域性,那其他元素的值為0,如果在區域性定義的,那其他元素的值還是隨機的)

四、用memset函式(須加標頭檔案)

memset函式是按位元組賦值,基本用法:memset(開始位址,每位元組的值,需賦值的位元組數);

以下示例是陣列均定義為int a[10];

例1:memset(a,0,40);作用是把a陣列的所有10個元素賦值為0。

為什麼是40而不是10呢?這個函式是按位元組賦值,每個int的變數佔4位元組,10個int變數就佔40位元組。

這種對全部變數賦值的寫法一般可換成memset(變數名,每位元組的值,sizeof(變數名));如上例可改為memset(a,0,sizeof(a));

例2:memset(a,1,sizeof(a));作用是把陣列範圍內每乙個位元組(不是變數)的值賦值為1。那個變數實際的值為多少呢?

由於每個int變數佔4位元組,每個位元組的值為1,換成二進位制來看,每個變數變數的值實際應為00000001 00000001 00000001 00000001(為了方便大家看,我在每兩個位元組中間加了空格),換成10進製為16843009。即把a陣列中每個值都賦值為16843009。

例3:如果想給變數賦更大的值可以用memset(a,0x7f,sizeof(a));即每個變數的值換成二進位制為01111111 01111111 01111111 01111111,這個值幾乎接近int型別的上限(2^31-1),這樣的兩值相加就將會溢位。如果希望值很大還有接受一次加法,可考慮memset(a,0x3f,sizeof(a));這樣每個變數的值大約為1e9,略低於最大int值的一半。

例4:memset(a,-1,sizeof(a));作用是將每個變數的值均賦值為-1。對於一位元組有符號的數值來說,最高位為1代表負數,後面的值用反碼表示,那一位元組的-1就用11111111表示,四位元組的-1則表示成11111111 11111111 11111111 1111111,故實際感覺就是按位填充0和-1得到的int值和按值填充0和-1實際效果一樣。

例5:memset(a+2,1,20);作用是把陣列中第3到7個值賦值為16843009,其他值未改變。這裡的20是位元組數,int型別乙個變數佔4個位元組,即20位元組實際占用5個變數範圍,a[3]到a[7]正好5個變數。

注意memset與fill兩個函式的不同!

五、迴圈賦值(手動賦值)

對於其他需求情況下,還可以利用迴圈賦值初始化。

例1:for(int i=0;i<10;i++)a[i]=0x7fffffff;可把陣列a[0…9]全賦值為2^31-1;(這裡的0x7fffffff是16進製表示數)。

迴圈賦值是一種較為靈活的賦值方法,可根據需要進行,也可以對各個變數賦不同的值。

例2:for(int i=0;i<10;i++)a[i]=i;其效果等同於直接定義賦初值int a=;

1、陣列名+n方式取得的位址不是按位元組計算位址偏移量,而是按變數實際佔位偏移位置。

例如:int a[10]定義陣列,那麼a+2則是陣列首位址向後偏移2個int位,即8位元組,若用long long int a[10]定義陣列,a+2則是陣列首位址向後偏移16位元組。

2、一般來說,memset的效率比fill高。

3、陣列賦值要注意別讓下標越界,否則是導致不可預知的錯誤。

陣列初始化

cpp中陣列初始化方法 簡單的初始化 利用定義變數時賦初值進行初始化。int a 10 float f 10 char ch 5 大括號中的為初始值。較為複雜的初始化 利用memset函式初始化。memset函式用法 void memset void s,int c,size t n 將已開闢記憶體...

陣列初始化

flydream flydream c cat x.cpp include using namespace std int main int argc,char argv flydream flydream c flydream flydream c g g wall x.cpp x.cpp in ...

陣列初始化

一 定義陣列 type arrayname 注 1 陣列定義 c語言宣告 時,不能指定陣列長度。2 定義只是在stack中指定了乙個引用變數,heap中未分配記憶體,所以要在初始化後才能使用。二 陣列初始化 1 靜態初始化 arrayname new type 或 arraynane 注 開發中習慣...