1. 程式人生 > >c++陣列的幾個有趣性質

c++陣列的幾個有趣性質

1.陣列可以有負數下標

這是我在陣列中畫圓時偶然發現的。如圖,圓左邊的一部分跑到右邊去了。

我猜這可能是負數下標的問題。按照“陣列名存放的是陣列第一個元素的地址”以及“陣列下標表示的是偏移量”這兩條理論,我進行了如下推理:

對一個二維陣列a[m][n],元素a[x][y]的偏移量計算公式:n*x+y。以往我都以為x,y必須是正數,但其實x,y不一定非要同時為正數,只要m*n>n*x+y>0,就能正確訪問陣列當中的元素。

例子:

對於m=5,n=3來說

a[2][-2]=a[1][1]

因為偏移量2*3-2=4,所以a[2][-2]a[1][1]等價.

在vs2012上測試成功。

二.二維陣列打印出來時,座標系的問題

這其實是用二維陣列表示地圖時最核心的問題。一般我們用類似這樣的語句在控制檯上打印出picture陣列中存放的內容:

	for(int i=0;i<mAXIS;i++)
	{
		for(int j=0;j<nAXIS;j++)
	        cout<<picture[i][j]<<" ";
	  cout<<endl;
	}
這樣打印出來的地圖,picture[i][j]表示的是哪個元素呢?

答案是:第i行第j列。

問題來了,學過數學的人都知道,橫向是x軸,縱向是y軸。 把這種習慣帶到程式設計中的話,一個自然而然的想法就是,picture[i][j]表示的是座標(i+1,j+1)上的元素。


以圖中標出的元素為例,它的座標在當前座標系下應該是(3,2),一個自然的想法是,它應該表示為picture[2][1]    //按照陣列從0開始的規則

實際上並不然,由於該元素處於第2行第3列,所以它實際上是picture[1][2]

以前命名的時候總喜歡把元素下標命名為x,y,這樣的誤導性太強了,也不符合思維習慣,以後乾脆改成m,n好了