在C/C++中,數組和指針有着密切的關系,但是二者是完全不同的資料結構。
二維數組是數組的數組,數組的每一個元素是一個數組。
1、那麼怎麼利用一個數組的通路方式來通路二維數組呢?
首先,定義一個二維數組
int iArr[2][3]={0,1,2,3,4,5};
我們可以用一個指向int型的指針變量來通路這個數組,下面代碼是将數組一維化:
int*p=iArr[0];
上面的 iArr[0]就是代表第一個數組的首位址,由于二維數組在記憶體中的存儲也是先行後列的方式,是以第二行也緊跟第一行之後,這樣就可以用p來通路數組的元素值了,通路方式有下标和指針的方式:
printf(“%d”,p[3]);
printf("%d\n",*(p+3));
最後輸出的結果都是3。
但是二維數組可以想當然的認為是二級指針嗎?
#include "stdafx.h"
#include<stdio.h>
int main(int argc, char *argv[])
{
int a[2][3] = { 1, 2, 3, 4, 5, 6 };
int*p = a[0];
printf("%d\n", p[3]);
//int**p = a;
//出錯,error C2440: “初始化”: 無法從“int [2][3]”轉換為“int **”
//int(*pa)[3];//說明pa是一個數組指針,
//指向一個數組元素為int類型并且元素的個數為3的一個數組指針
//括号不能少,少了就變成指針數組,代表數組的每一個元素是指針類型
int(*pa)[3] = a;//二維數組的數組名是指向第一行數組的首位址,
//可以用這種數組名或指針來通路二維數組的元素
//通路第一行第二列的元素
printf("%d\n", *(*(pa+1)+2));
printf("%d\n", *(*(pa + 1) + 2));//輸出都是6,想不明白,高手看到請指點
return 0;
}