天天看點

二維數組和指針的關系

在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;
}