設有整型二維陣列a[3][4]如下:
0 1 2 3
4 5 6 7
8 9 10 11
它的定義為:
int a[3][4]=,,}
設陣列a的首位址為1000,各下標變數的首位址及其值如圖所示。
前面介紹過,c語言允許把乙個二維陣列分解為多個一維陣列來處理。因此陣列a可分解為三個一維陣列,即a[0]、a[1]、a[2]。每乙個一維陣列又含有四個元素。
例如a[0]陣列,含有a[0][0],a[0][1],a[0][2],a[0][3]四個元素。
更多的見:
陣列及陣列元素的位址表示如下:從二維陣列的角度來看,a是二維陣列名,a代表整個二維陣列的首位址,也是二維陣列0行的首位址,等於1000。a+1代表第一行的首位址,等於1008。如圖:
array的型別既不是int **
更不是(int *a)[4]
而是int [3][3]
只是作為右值時才轉換成
int (*a)[4] a是指向乙個有4個元素的陣列的指標,事實上這個a此時指向a[0],指向陣列,就是說a裡儲存著陣列的位址,就是1000
指標陣列:
array of pointers
,即用於儲存指標的陣列,也就是陣列元素都是指標
陣列指標:
a pointer to an array
,即指向陣列的指標
還要注意的是他們用法的區別,下面舉例說明。
int* a[4]
指標陣列
表示:陣列
a中的元素都為
int型指標
元素表示:
*a[i] *(a[i])
是一樣的,因為
優先順序高於
*int (*a)[4]
陣列指標
表示:指向陣列
a的指標
元素表示:
(*a)[i]
#include
using namespace std;
int main()
int c[4]=;
int *a[4]; //指標陣列
int (*b)[4]; //陣列指標
b=&c;
//將陣列c中元素賦給陣列a
for(int i=0;i<4;i++)
a[i]=&c[i];
//輸出看下結果
int ** p,就是乙個指標,這個指標指向了int* 也就是乙個整型陣列,p是指向了整數陣列的指標,p中是整數陣列的位址,(int *array)[n] 和int **的區別就在於每行的元素個數固不固定
int func(int **array, int m, int n) ,
,func(array,3,3);
這樣傳遞二維陣列是錯的,因為型別不匹配,是因為陣列實際型別是int [3][3],在作為右值時可以被轉化為int (*)[3],它們都和int **不同,自然不可用。
法一 直接使用陣列型別:因為陣列實際型別是int [3][3]
可以用二維陣列名作為實參或者形參,在被呼叫函式中對形引數組定義時可以指定所有維數的大小,也可以省略第一維的大**明,如:
void func(int array[3][10]);
void func(int array[10]);
二者都是合法而且等價,但是不能把第二維或者更高維的大小省略,如下面的定義是不合法的:
void func(int array);
因為從實參傳遞來的是陣列的起始位址,在記憶體中按陣列排列規則存放(按行存放),而並不區分行和列,如果在形參中不說明列數,則系統無法決定應為多少行多 少列,不能只指定一維而不指定第二維
法二.一維陣列指標作為形參
void func2(int (*parray)[10])
void func2_1(int (*parray)) //編譯通過,無法呼叫
int main()
int array[10][10];
func2(array);
把array[0] 陣列的指標傳給了func2 因為array是指向10個元素的陣列的指標,(*array)就是array[0],(*array)[0] 就是array[0][0]
法三.二維陣列引用作為形參
void func3(int (&parray)[10][10])
int main()
int array[10][10];
func3(array);
以下是一維陣列引用的例子
#include
using namespace std;
void output(int (&a)[5])
for(int i = 0; i < 5; i++)
cout
int a[5]=;
output(a);
getchar();
return 0;
法四。二維陣列指標作為形參
void func4(int (*parray)[10][10])
int main()
int array[10][10];
func4(&array);
C語言 二維陣列作為函式引數
想來學c語言的人,都會覺得陣列並不是很難,一問c語言最難的是什麼?指標?結構體?今天我就以我們認為不難的陣列聊聊。上學的時候老師就告訴我們 乙個就想當與乙個 這句話有問題嘛?答案是沒問題。但是,就是因為這個沒問題,導致工作中有問題。乙個簡單的思考 int arr 4 5 int p arr 請問,有...
C語言二維陣列作為函式引數傳遞
二維陣列中元素排列的順序是按行存放的,即在記憶體中先順序存放第一行的元素,再存放第二行的元素.二維陣列作為函式引數,實參可以直接使用二維陣列名,在被呼叫函式中對形引數組定義可以指定所有維數的大小,也可以省略第一維的大 明,如 void f int a 3 4 void f int a 4 它們是合法...
二維陣列 作為函式引數
前言 今天在實現裝配線排程程式時候,用到了二維陣列,並將其作為函式的引數。在寫程式的時候,遇到一些問題,即二維陣列做函式的引數應該如何正確表示。我寫程式的錯誤如下程式所示 1 include 2 void print int a 3 3 67intmain 8 10print a 11return0...