C++ 指標陣列與陣列指標的區別

猜不透的思想發表於2013-04-09
/* 指標陣列和陣列指標的區別 */
#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
	/* 熱身,首先看看一維陣列 */
	int arr[3] = {1,2,3} ;
	int *arr_p = arr ;				//這裡直接宣告一個指標,指向一維陣列的首地址即可
	cout << "以下為熱身的一維陣列:" << endl ;
	for(int i = 0 ; i < 3 ; ++i)	//遍歷陣列
		cout << arr_p[i] << "	" ;
	cout << "\n\n/*-------------分--割--線-------------*/\n\n" << endl ;

/*----------------------------------分----割----線---------------------------------*/

	/* 重點,下面講講二維陣列 */
	int arr2Dim[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11} ;			//定義並初始化

	/* 首先是 陣列指標,可以理解為“指向陣列的指標”,主語是“指標”,便於記憶與區分 */
	int (*arrPtr)[4] ;				/* arrPtr是指標,可以理解為指向一維陣列,每個一維陣列有4個int元素 */

	/* 以下為兩種不同的初始化方式 */
	//arrPtr = arr2Dim ;
	arrPtr = &arr2Dim[0] ;

	cout << "以下利用 陣列指標 輸出的二維陣列:" << endl ;

	for(int i = 0 ; i < 3 ; i++ )/*輸出二維陣列中各個元素的數值*/
    {
        for(int j = 0 ; j < 4 ; j++ ) 
        {
			/* 以下為兩種不同的輸出方式 */
			cout << *(*(arrPtr+i)+j) << "	" ;
			//cout << (*arrPtr+i*sizeof(int))[j] << "	" ;
        }
        cout << endl ;
    }
	cout << endl ;

	cout << "\n\n/*-------------分--割--線-------------*/\n\n" << endl ;

	cout << "以下有助於理解陣列指標的儲存:" << endl ;

	cout << "arrPtr[0] = "	<< arrPtr[0] << " | "	<< "arrPtr[1] = "  << arrPtr[1] 
		<< " \n"<< "arrPtr[2] = "  << arrPtr[2] << " | "<< "arrPtr[3] = "  << arrPtr[3] << endl ;

	cout << "arrPtr = "		<< arrPtr	 << endl ;

	/* *arrPtr表示arrPtr所指向的陣列 */
	cout << "arrPtr = "		<< *arrPtr	 << endl ;	

	/* (* arrPtr)[i] 會返回陣列的第 i+1 個元素值 */
	cout << "(*arrPtr)[0] = "	<< (*arrPtr)[0]		<< " | "<< "(*arrPtr)[1] = "  << (*arrPtr)[1] 
		<< " \n"<< "(*arrPtr)[2] = "  << (*arrPtr)[2] << " | "<< "(*arrPtr)[3] = "  << (*arrPtr)[3] << endl ;	
	
	/* (* arrPtr)[i] 是等價於 *((*arrPtr) + i) 的,因此當i=0時,表示陣列第一個元素的值 */
	cout << **arrPtr << endl ;			

	/* *arrPtr+1則是(*arrPtr)[1]這個元素的地址,所以輸出的是(*arrPtr)[3]這個元素 */
	cout << *(*arrPtr+3) << endl ;		

	/* 經過 arrPtr++ 語句,由於 arrPtr 是陣列指標,後來arrPtr中存放的地址應該是*arrPtr+sizeof(arr2Dim[0]) */
	arrPtr++;	

	cout << "\narrPtr++之後\n" << endl ;

	cout << "arrPtr[0] = "	<< arrPtr[0] << " | "	  << "arrPtr[1] = "  << arrPtr[1] 
		 << " \n"<< "arrPtr[2] = "		 << arrPtr[2] << " | "<< "arrPtr[3] = "  << arrPtr[3] << endl ;
	cout << "arrPtr = "		<< arrPtr	 << endl ;
	cout << "arrPtr = "		<< *arrPtr	 << endl ;
	cout << "(*arrPtr)[0] = "	<< (*arrPtr)[0]		<< " | "<< "(*arrPtr)[1] = "  << (*arrPtr)[1] 
		 << " \n"<< "(*arrPtr)[2] = "	 << (*arrPtr)[2] << " | "<< "(*arrPtr)[3] = "  << (*arrPtr)[3] << endl ;
	cout << "**arrPtr = "	<< **arrPtr	 << endl ; 
	cout << "*(*arrPtr+3) = "	<< *(*arrPtr+3)		<< endl ; 

	cout << "\n\n/*-------------分--割--線-------------*/\n\n" << endl ;
	
/*----------------------------------分----割----線---------------------------------*/
	

	int *ptrArr[3] ;	/* 指標陣列,含有3個int指標,也就是說每一個元素都是指標 */

	/* 以下例子可以幫助理解,parr 的元素內容都是地址 */
	int n1 = 10; 
	int n2 = 20; 
	int* parr[2] = { &n1 , &n2 }; 
	//cout << *(parr[0]) << "	" << *(parr[1]) <<endl; /* 輸出10	20 */
	int **p2p=parr;	/* 上面分析,型別一致 */

	/* 通過以下方式賦值 */
	for(int i = 0 ; i < 3 ; i++)
		ptrArr[i] = arr2Dim[i] ;

	cout << "以下利用 指標陣列 輸出的二維陣列:" << endl ;

	for(int i = 0 ; i < 3 ; i++ )
    {
        for(int j = 0 ; j < 4 ; j++ )
        {
			/* 以下為兩種不同的輸出方式 */
			cout << ptrArr[i][j] << "	" ;
			//cout << *(ptrArr[i]+j) << "	" ;
        }
        cout << endl ;
    }
    cout << endl ;


	return 0;
}



以下為輸出結果:

以下為熱身的一維陣列:
1       2       3

/*-------------分--割--線-------------*/

以下利用 陣列指標 輸出的二維陣列:
0       1       2       3
4       5       6       7
8       9       10      11

/*-------------分--割--線-------------*/

以下有助於理解陣列指標的儲存:
arrPtr[0] = 0012FED0 | arrPtr[1] = 0012FEE0
arrPtr[2] = 0012FEF0 | arrPtr[3] = 0012FF00
arrPtr = 0012FED0
arrPtr = 0012FED0
(*arrPtr)[0] = 0 | (*arrPtr)[1] = 1
(*arrPtr)[2] = 2 | (*arrPtr)[3] = 3
0
3

arrPtr++之後

arrPtr[0] = 0012FEE0 | arrPtr[1] = 0012FEF0
arrPtr[2] = 0012FF00 | arrPtr[3] = 0012FF10
arrPtr = 0012FEE0
arrPtr = 0012FEE0
(*arrPtr)[0] = 4 | (*arrPtr)[1] = 5
(*arrPtr)[2] = 6 | (*arrPtr)[3] = 7
**arrPtr = 4
*(*arrPtr+3) = 7

/*-------------分--割--線-------------*/

以下利用 指標陣列 輸出的二維陣列:
0       1       2       3
4       5       6       7
8       9       10      11


參考連結:

http://blog.csdn.net/kaiming2008/article/details/5617155/

http://wenku.baidu.com/view/9cade80b763231126edb1162.html

相關文章