設有整型二維數組a[3][4]如下:
0 1 2 3
4 5 6 7
8 9 10 11
它的定義為:
int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}
設數組a的首地址為1000,各下標變量的首地址及其值如圖所示。
前面介紹過,C語言允許把一個二維數組分解為多個一維數組來處理。因此數組a可分解為三個一維數組,即a[0]、a[1]、a[2]。每一個一維數組又含有四個元素。
例如a[0]數組,含有a[0][0],a[0][1],a[0][2],a[0][3]四個元素。
更多的見: http://c.biancheng.net/cpp/html/79.html
數組及數組元素的地址表示如下:從二維數組的角度來看,a是二維數組名,a代表整個二維數組的首地址,也是二維數組0行的首地址,等於1000。a+1代表第一行的首地址,等於1008。如圖:
int array[3][3];
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 <iostream>
using namespace std;
int main()
{
int c[4]={1,2,3,4};
int *a[4]; //指針數組
int (*b)[4]; //數組指針
b=&c;
//將數組c中元素賦給數組a
for(int i=0;i<4;i++)
{
a[i]=&c[i];
}
//輸出看下結果
cout<<*a[1]<<endl; //輸出2就對
cout<<(*b)[2]<<endl; //輸出3就對
return 0;
}
(int *array)[N] 和int **的區別
Int ** p,就是一個指針,這個指針指向了int* 也就是一個整型數組,p是指向了整數數組的指針,p中是整數數組的地址,(int *array)[N] 和int **的區別就在於每行的元素個數固不固定
傳遞二維數組參數
int func(int **array, int m, int n) {
...
printf("\t%d", *(*array +i*n +j));
...
}
int main() {
int array[3][3] = {
{1,2,3},
{4,5,6},
{7,8,9}
};
...
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 <iostream>
using namespace std;
void output(int (&a)[5])
{
for(int i = 0; i < 5; i++)
cout<<a[i]<<endl;
}
int main()
{
int a[5]={0};
output(a);
getchar();
return 0;
}
法四。二維數組指針作為形參
void func4(int (*pArray)[10][10])
{
}
int main()
{
int array[10][10];
func4(&array);
}