有關於C 多維陣列的初始化,C 的二維陣列初始化

2022-04-01 05:15:14 字數 5173 閱讀 8178

1樓:敗筆i無悔

c++是在c語言的基礎上開發的一種物件導向程式語言,應用廣泛。c++支援多種程式設計正規化 --物件導向程式設計、泛型程式設計和過程化程式設計。最新正式標準c++於2023年8月18日公佈。

其程式設計領域眾廣,常用於系統開發,引擎開發等應用領域,是至今為止最受廣大程式設計師受用的最強大程式語言之一,支援類:類、封裝、過載等特性!

陣列必須作為 extern 或者 static 儲存類來定義才能初始化

分行給二維陣列賦初值。如

static int a[3][4]=,,};

這種賦初值方法比較直觀,把第一個花括弧內的資料賦給第一行的元素,第二花括弧內的資料賦給第二行的元素,......,即按行賦初值。

可以將所有資料寫在一個花括弧內,按陣列排列的順序對各元素賦初值。如:

static int a[3][4]=;

效果與前相同。但以第1種方法為好,一行對一行,界限清楚。用第2種方法如果資料多,寫成一大片,容易遺漏,也不易檢查。

可以對部分元素賦初值。

static int a[3][4]=,,};

它的作用是隻對各行第1列的元素賦初值,其餘元素值自動為0。賦初值後陣列各元素為

也可以對各行的某一元素賦初值:

static int a[3][4]=,,};

初始化後的陣列元素如下:

這種方法對非0元素少時比較方便,不必將所有的0都寫出來,只需輸入少量資料。也可以只對某幾行元素賦初值:

static int a[3][4]=};

陣列元素為:

第三行不賦初值。也可以對第二行不賦初值:

static int a[3][4]=,{},};

如果對全部元素都賦初值(即提供全部初始資料),則定義陣列時對第一維的長度可以不指定,但第二維的長度不能省。如

static int a[3][4]=;

與下面的定義等價:

static int a[4]=;

系統會根據資料總個數分配儲存空間,一共12個資料,每行4列,當然可確定為3行。

在定義時也可以只對部分元素賦初值而省略第一維的長度,但應分行賦初值。如

static int a[4]=,{},};

這樣的寫法,能通知編譯系統:陣列共有3行。陣列各元素為memset(buff,0,5*100*sizeof(char));

2樓:和小敘

這個......

不管是多維陣列還是一維陣列,其實都是一個意思,它們存放在記憶體當中都是連續的,只是表示的方法不一樣而已。

要用陣列首先要清楚,一個陣列在定義時長度已經是確定了的(即陣列元素個數確定),確定了編譯器才知道分多少記憶體給這個陣列,不然編譯出錯。如果你在定義陣列時沒有說明陣列長度,只給出陣列各個元素的值,編譯器會根據給出的元素值的個數確定陣列長度。下面的兩種情況:

char arr1[8] = ; //陣列長度為8 能表示到arr1[7]

char arr2[ ] = ; //陣列長度為2 只能表示到arr2[1]

這裡有個預設值的說法。沒初始化的陣列元素它們都預設為0。也就是說,在你定義一個陣列時已經確定了它的長度,如果你不初始化它們,預設都為0 。

你的程式中只是對第一個元素給出了3,其它的都沒有初始值,預設為0。

因此才會輸出0。這很正常。

給你個建議,如果你嫌你定義的陣列太大了,每個都要寫個3,太痛苦了,可以來三層迴圈:

for(i = 0;i < 10;i ++)}}

這樣每個都是3了。

3樓:吥洅丨錯過

我們知道,一維空間是一條線,數學中用一條數軸來表達;二維空間是一個平面,數學中用平面座標系來表達。那麼二維陣列又是什麼樣的呢?

線與面我們用一個下標來描述一維陣列中的某個元素,就好像在用數描述一條線上的點。而所有的資料都是儲存在一條線上。如果我們採用兩個下標,就能形成一個平面,猶如一張**,有行有列,所有的資料就能夠存放到**裡。

我們把二維陣列的兩個下標分別稱為行下標和列下標,在前面的是行下標,在後面的是列下標。

那麼什麼時候要用二維陣列呢?一般有兩種情況,一種是描述一個二維的事物。比如用1表示牆,用0表示通路,我們可以用二維陣列來描述一個迷宮地圖;用1表示有通路,0表示沒有通路,我們可以用二維陣列來描述幾個城市之間的交通情況。

還有一種是描述多個具有多項屬性的事物。比如有多個學生,每個學生有語文、數學和英語三門成績,我們就可以用二維陣列來描述。

對於第二種情況,我們要注意各項屬性應該是同一種資料型別,比如三種學科的成績都是整數。如果出現了姓名(字串屬性),就不能將他們組合到一個二維陣列裡去。所以不要企圖將不同資料型別的屬性整合到一個二維陣列中去。

二維陣列的宣告和初始化

二維陣列的宣告和一維陣列是類似的,不同之處只是多了一個下標:

資料型別陣列名[行數][列數];

要注意,二維陣列的下標也都是從0開始的。

二維陣列的初始化分為兩種,一種是順序初始化,一種是按行初始化,我們來看一段程式,就能夠對它們有所瞭解了:(程式7.4.1)

#include "iostream.h"

#include "iomanip.h"

int main()

;//順序初始化

int array2[3][2]=,,};//按行初始化

cout <<"array1" <

for (int i=0;i<3;i++)//輸出陣列array1

cout <

}cout <<"array2" <

for (int k=0;k<3;k++)//輸出陣列array2

cout <

}return 0;

}執行結果:

array1

4 25 6

13 4

array2

4 25 8

6 8我們可以看出,所謂按順序初始化就是先從左向右再由上而下地初始化,即第一行所有元素都初始化好以後再對第二行初始化。而按行初始化則是用一對大括號來表示每一行,跳過前一行沒有初始化的元素,在行內從左向右地進行初始化。對於沒有初始化的元素,則都是一個不確定的值。

省略第一維的大小

我們在第一節學到,一維陣列的大小可以省略。可是二維陣列的元素個數是行數和列數的乘積,如果我們只告訴電腦元素個數,電腦無法知道究竟這個陣列是幾行幾列。所以,c++規定,在宣告和初始化一個二維陣列時,只有第一維(行數)可以省略。

比如:int array[3]=;

相當於:

int array[2][3]=;

二維陣列在記憶體中的儲存情況

先前已經說明,記憶體是依靠地址來確定記憶體中的唯一一個儲存單元的,即只有一個引數。所以在記憶體中,所有的資料都是像一維陣列那樣順序儲存的。那麼具有兩個下標的二維陣列是怎樣存放到記憶體中的呢?

在記憶體中,先將二維陣列的第一行按順序儲存,接著就是第二行的資料,然後是第三行的資料……右圖(圖7.4)所示的就是一個二維陣列在記憶體中的儲存情況。

向函式傳遞二維陣列

我們知道,陣列作為引數傳遞給函式的是陣列首元素的地址。對於二維陣列來說亦是如此。不過有兩個問題,一個是我們必須讓函式知道行數和列數,這就像我們要讓函式知道一維陣列的大小一樣,防止發生越界訪問。

另一個就是我們必須讓電腦知道這個二維陣列是怎樣的一個**,即必須告知陣列的列數。這和只能省略二維陣列的行數道理是一樣的。下面我們就來看一個向函式傳遞二維陣列的程式:

#include "iostream.h"

#include "iomanip.h"

void disp(int a[2],int r,int c);//告知陣列的列數

int main()

;cout <<"array" <

disp(array,3,2);

4樓:

int arr[10][21][32]=;這樣對多維陣列可以初始化為全0。但遵循的規則是:陣列宣告並初始化時{}中沒有寫全的後面部分被自動初始化為0。

所以你寫int arr[10][21][32]=;的結果是arr[0][0][0]=3,其餘的都是0。想要初始化為全3,可以用memset函式。

5樓:特立獨行的瓜慫

如果是二維陣列就這樣

int a[2][3]=,}

a[m][n]就有m個小{}號 最外面是{}號包起來每個小的{}裡有n個資料,可以部分初始化 也可以全部初始化

6樓:匿名使用者

多維陣列不能這樣初始化的,要用memset,而且只能是0和-1.

c++ 的二維陣列初始化

7樓:巢婧谷和

絕對錯了,不錯你扇死我!

二維陣列的初始化分為,一種為按行分段初始化,另一種為按行連續初始化。

inta[2][3]=,,};

這是第一種,

inta[2][3]=;

這是第二種。

a這個二維陣列一共2行3列共6個儲存空間,圖形為:5678910

正好佔滿。

而且c語言預設可以省略行數,但不能省略列數你看看你的初始化

inta[4]=,{},};

行數省略是沒有任何問題的。

但是你是按行分段初始化

第一行003

第二行第三行0

10注意了,你只對其中3行進行了初始化,第4行丟了。

所以a是一個半初始化的陣列,c編譯系統絕對不承認!

8樓:匿名使用者

上面的**中最後少了};

另外陣列不能整體拷貝.只能通過下標逐個賦值

9樓:匿名使用者

(1)iostream後面不加.h,

(2)int n[3][3]=0有誤,不能對陣列進行這樣的初始化,應該是對陣列元素逐個賦值

(3)int (*m)[3]=new int[3][3]; 前面不加int,加上的話,相當於在區域性對m重新定義

初始化方法如下:

(1)int m[3][3];

for(int i = 0; i < 3; i++)for(int j = 0; j < 3; j++)m[i][j] = 0;

(2)int **m = new int*[3];

for(int i = 0; i < 3; i++)(3)int *m[3];

int **m = new int*[3];

for(int i = 0; i < 3; i++)第二種寫法和第三種寫法本質上一樣的,指向指標的指標其實就是指標的陣列

C語言結構體陣列的初始化,C語言結構陣列初始化的問題

定義成struct list 試試呢?struct list creat char name,int priority,int time 同學,你注意到了create 函式裡面,你又定義了一句 list pr 了麼?這句話時關鍵,首先,你在main 函式 我猜應該是main吧 中寫道 list pr...

關於C語言裡的初始化問題為什麼要初始化

區域性變數初始化 是指在使用這個區域性變數前,要對其進行初始化。這是因為區域性變數是從記憶體堆中分配的,用完就還給記憶體堆,所以被分配的區域性變數並不一定是0,而很可能是其他地方用過的一個值,因此在使用這個變數之前,要對它進行顯示初始化。c的區域性變數一般是在棧上進行分配的。棧使用的是ram,掉電內...

C 中類的建構函式的隱式初始化和顯示初始化怎麼理解

隱式初始化可以理解為自己不做任何的操作,有系統環境幫你完成變數的初始化。顯示的就是自己的操作了啊。隱式初始化,即在main 函式中,沒有顯式呼叫建構函式的語句。建構函式是在定義物件時被系統自動呼叫。如 類名 物件名 實參表 那麼顯式初始化應該是先宣告物件,再呼叫建構函式 即類名 物件名 物件名 建構...