C++ 指標陣列與陣列指標的區別
/* 指標陣列和陣列指標的區別 */
#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
參考連結:
相關文章
- 指標陣列與陣列指標指標陣列
- 指標陣列和陣列指標與二維陣列指標陣列
- 陣列指標,指標陣列陣列指標
- 陣列指標 指標陣列陣列指標
- 深入探索 C/C++ 陣列與指標的奧祕之一:陣列與指標概念剖析C++陣列指標
- Golang 學習——陣列指標和指標陣列的區別Golang陣列指標
- 陣列指標和指標陣列陣列指標
- 徹底搞清C/C++中一維陣列,二維陣列,指標,陣列指標和指標陣列以及指向指標的指標,行地址和列地址之間的關係C++陣列指標
- 指標 與 陣列 以及 a 與 &a的區別指標陣列
- C語言:陣列和指標的區別C語言陣列指標
- Go 陣列指標(指向陣列的指標)Go陣列指標
- C: (pointer) 陣列變數和指標的區別陣列變數指標
- 陣列指標陣列指標
- 陣列指標:a pointer to an array,即指向陣列的指標陣列指標
- 陣列和指標的問題陣列指標
- 深入探索 C/C++ 陣列與指標的奧祕之二:陣列名是一個指標常量嗎?C++陣列指標
- C語言程式設計基礎:指標陣列與陣列指標C語言程式設計指標陣列
- C語言學習歷程(十二)陣列指標與指標陣列C語言陣列指標
- C++語言中陣列指標和指標陣列徹底分析(系列一) (轉)C++陣列指標
- 二維陣列與指標陣列指標
- 陣列和指標陣列指標
- 指標和陣列指標陣列
- C/C++——指向函式的指標和指向函式的指標的陣列C++函式指標陣列
- 陣列地址與指標之間的區別與聯絡陣列指標
- 二維陣列的指標的理解陣列指標
- C語言 指標與陣列C語言指標陣列
- 陣列與指標&氣泡排序陣列指標排序
- 字串指標與字元陣列 (轉)字串指標字元陣列
- 補充內容:C++語言中陣列指標和指標陣列徹底分析 (轉)C++陣列指標
- C/C++——宣告一個到字元的指標,包含10個整數的陣列,到包含10個整數的陣列的引用,到字串的陣列的指標,到字元的指標的指標...C++字元指標陣列字串
- 指向陣列的指標陣列指標
- 陣列,函式與指標 詳解陣列函式指標
- c程式設計--指標與陣列C程式程式設計指標陣列
- 【C++】陣列指標與error: lvalue required as increment operandC++陣列指標ErrorUIREM
- 二維陣列和指標陣列指標
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- 關於二維陣列指標的問題陣列指標
- 指標問題的一點體會(區別 [指向指標的指標] 與 [指標的指標] .) (轉)指標