C語言的簡單使用(十二 多維陣列)

2021-09-27 02:25:33 字數 3421 閱讀 2284

先說一下,這裡的多維陣列是指二維往上,包括二維的陣列,這些知識在程式設計的過程中幾乎用不到,但是它能更好地幫助程式設計師理解變數在記憶體中的分布。

首先,乙個陣列就是相同型別的變數的有序集合,跟鍊錶的重要區別就是,陣列有序且順序不可更改( a[ i ] 後跟著的必定是 a[ i+1 ] )。

其次,陣列本質上還是記憶體中的一大片連續空間,不管它是幾維的。

在c語言中其實只有一維陣列,多維陣列是一維陣列的巢狀。乙個一維陣列的每個元素如果也是一維陣列,那它就是乙個二維陣列了。

一般來說定義乙個二維陣列是這種形式:

型別 陣列名[常量1][常量2]

//乙個二維陣列 a

int a[3]

[4];

它的形式可以理解為

a[0]

: a[0]

[0],a[0]

[1],a[0]

[2],a[0]

[3]a[

1]: a[1]

[0],a[1]

[1],a[1]

[2],a[1]

[3]a[

2]: a[2]

[0],a[2]

[1],a[2]

[2],a[2]

[3]

就像上面說的,陣列a的每乙個元素都是乙個一維陣列,把a的所以元素合起來就是乙個二維陣列。

還是以陣列 a 為例

a代表首元素位址

&a代表整個陣列的首位址,它和首元素位址一樣,但步長不一樣

可以用下面的**測試一下

int a[8]

;printf

("a:%d , a+1:%d\n"

,a,a+1)

;//+4,乙個int

printf

("&a:%d , &a+1:%d\n"

,&a,

&a +1)

;//+32,int*8

有一種定義陣列型別的方法是使用typedef

typedef

int a[8]

;//代表陣列型別,不是變數

a b;

//同int b[8],去了typedef,b替換到a的位置

只不過這種方法好像沒什麼人用。。。

這種陣列沒什麼好說的,就是乙個由指標構成的陣列

宣告方法:

int

*a[48];

(char

*)b[64]

;

操作起來就是個陣列。

陣列指標,它是指標,指向乙個陣列的指標,它指向整個陣列而不是首元素。

宣告乙個變數:

int a[10]

=;//陣列指標的宣告方法有3種

//1、先定義陣列型別,在根據型別定義指標變數

typedef

int a[10]

;//a陣列型別,[10]代表步長

a *p =

null

;//p陣列指標型別變數

//p = a;//a代表首元素位址,a和&a一樣,最終也是當作&a,有警告

p =&a;

//&a代表整個陣列的首位址,以後操作p就是操作a

//2、先定義陣列指標型別,根據型別定義變數

//和指標陣列寫法類似,多了()

//()和優先順序一樣,從左往右

//()有指標,它是乙個指標,

//指向陣列的指標,它有typedef,所以它是乙個陣列指標型別

typedef

int(

*p)[10]

;p q;

//陣列指標變數

q =&a;

//3.直接定義陣列指標變數

//和指標陣列寫法類似,多了()

//()和優先順序一樣,從左往右

//()有指標,它是乙個指標,

//指向陣列的指標,沒有typedef,所以它是乙個陣列指標變數

int(

*q)[10]

;//陣列指標變數

q =&a;

其實可以通過陣列名做很多事情

int a[

4]=;

//a:代表第0行首位址 !

//a+i->&a[i]:第i行首位址 !

//*(a+i)+j->&a[i][j]:第i行第j列元素位址 !

//*(*(a+i)+j)->a[i][j]:第i行第j列元素的值

在此之前要先說明,不論乙個陣列是幾維的,在記憶體中它都只能當成一維陣列來排列,這是被硬體限制死的,所以單單從記憶體中是無法判斷陣列的維數的。

#define _crt_secure_no_warnings

#include

#include

#include

void

printarray1

(int a[3]

[4])

printf

("\n");

}}//陣列做形參會退化為指標,指標步長不一定一樣

//a+1,一行,4

void

printarray2

(int a[

4])printf

("\n");

}}//步長不一樣

void

printarray3

(int

**a)

//err

printf

("\n");

}}//陣列指標

//typedef int (*p)[4];

void

printarray4

(int

(*a)[4

])printf

("\n");

}}//陣列指標

typedef

int(

*arr)[4

];void

printarray5

(arr a)

printf

("\n");

}}intmain

(void);

//定義陣列指標型別,再定義變數

typedef

int(

*p)[10]

; p p =0;

p = a;

printarray5

(p);

printf

("a:%d,&a:%d\n"

,a,&a)

;printf

("a+1:%d,&a+1:%d\n"

, a+1,

&a+1);

printf

("\n");

system

("pause");

return0;

}

C專家程式設計 十二 C語言的多維陣列

有些人聲稱c語言沒有多維陣列,這是不對的。ansi c標準在第6.5.4.2節以及第69號腳注上表示 當幾個 修飾符連續出現時 方括號裡面是陣列的範圍 就是定義乙個多維陣列。但所有其他語言都把這稱為 陣列的陣列 c語言的方法多少有點獨特 定義和引用多維陣列惟一的方法就是使用陣列的陣列。儘管c語言把陣...

C語言陣列之多維陣列

多維陣列 可以理解為存放陣列的陣列 以宿舍或公寓為例 元素 就是乙個乙個房間 1001 一層 相當於是一維陣列 一棟樓 就相當於二維陣列 乙個園區 就相當於三維陣列 乙個高教區 就相當於四位陣列 乙個城市 就相當於五維陣列 多維陣列定義演示 int arr 10 10 10 10 10 10 pri...

C語言基礎 多維陣列

今天我們來學習陣列的另一種用高階用法,多維陣列。多維陣列的定義與使用與數學定義一致,它可以表示多維的數值。一 二維陣列 例如我們先來定義乙個二維陣列 int array 3 4 我們可以像上面例子一樣在陣列定義時為其指定初始值,也可以在陣列定義之後再為其賦值。上面例子中我們定義了乙個具有3行的陣列,...