/* 指针数组和数组指针的区别 */
#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.youkuaiyun.com/kaiming2008/article/details/5617155/