数组指针&指针数组傻傻分不清

数组指针(指向数组的指针)

指向数组元素的指针,可以通过数组指针来访问数组内的元素,指针加一,代表指向数组的下一行
  • 一维数组指针: int *p
  • 二维数组指针: int (p)(n) :n 代表二维数组的行数,p是行指针,p加一表示指向p的下一行首地址. ( *( p+2 ) + 1 ) 表示: array[2][1]

指针数组(指针类型的数组)

指针数组是数组元素都是指针的一种数组,是数组的一种类型: int *p[3] 

定义一维数组

1
2
int array_size = 4;           //数组长度
int *p = new int[array_size];

那第二个语句计算机内部具体是怎么如何执行的?

  • array_size 指明所需空间(以块来计数)的块数
  • int 指明所需空间每块的大小(int类型占用四个字节)
  • new 关键字用来命令计算机分配一定大小的内存空间,并返回该内存空间的首地址.(重点)
  • p 指针指向系统分配的内存空间的首地址

于是利用p可以访问数组内部的元素

1
2
3
//下面两种访问数组方式是等效的
cout<<*(p+1)<endl;
cout<<p[1]<<endl;

定义二维数组

指针数组方式定义二维数组

下面看个例子

1
2
3
4
5
6
7
8
9
10
11
12
int *p[4];                       //定义一个指针数组,里面有四个指针
for(int j=0;j<4;j++){ //为每个指针分配一个连续的四个int大小的空间
p[j] = new int[4];
memset(p[j],0,sizeof(int)*4); //为第j个指针指向的数组赋初值0
}

for(int k=0;k<4;k++){ //输出二维4*4数组
for(int i=0;i<4;i++){
cout<<"p["<<k<<"] ["<<i<<"]:"<<p[k][i]<<" ";
}
cout<<endl;
}

结果

1
2
3
4
5
p[0] [0]:0  p[0] [1]:0  p[0] [2]:0  p[0] [3]:0
p[1] [0]:0 p[1] [1]:0 p[1] [2]:0 p[1] [3]:0
p[2] [0]:0 p[2] [1]:0 p[2] [2]:0 p[2] [3]:0
p[3] [0]:0 p[3] [1]:0 p[3] [2]:0 p[3] [3]:0
Press any key to continue

数组指针方式定义二维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int arr[4][4];
memset(arr,0,sizeof(int)*16);

//输出数组
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++){
cout<<"arr["<<i<<"]["<<j<<"]:"<<arr[i][j]<<" ";
}
cout<<endl;
}
int (*p)[4] = arr; //定义一个数组指针(行指针),指向数组的每行首地址
*(*(p+2)+2) = 4; //等价于arr[2][2]=4
cout<<"-----------------------"<<endl;
//输出数组
for(i=0;i<4;i++)
{
for(int j=0;j<4;j++){
cout<<"arr["<<i<<"]["<<j<<"]:"<<arr[i][j]<<" ";
}
cout<<endl;
}

结果

1
2
3
4
5
6
7
8
9
10
arr[0][0]:0 arr[0][1]:0 arr[0][2]:0 arr[0][3]:0
arr[1][0]:0 arr[1][1]:0 arr[1][2]:0 arr[1][3]:0
arr[2][0]:0 arr[2][1]:0 arr[2][2]:0 arr[2][3]:0
arr[3][0]:0 arr[3][1]:0 arr[3][2]:0 arr[3][3]:0
-----------------------
arr[0][0]:0 arr[0][1]:0 arr[0][2]:0 arr[0][3]:0
arr[1][0]:0 arr[1][1]:0 arr[1][2]:0 arr[1][3]:0
arr[2][0]:0 arr[2][1]:0 arr[2][2]:4 arr[2][3]:0
arr[3][0]:0 arr[3][1]:0 arr[3][2]:0 arr[3][3]:0
Press any key to continue

可以从结果中看出arr[2][2]的值被修改了

本文标题:数组指针&指针数组傻傻分不清

文章作者:定。

发布时间:2017年4月21日 - 01时04分

本文字数:2,777字

原始链接:http://cocofe.cn/2017/04/21/数组指针&指针数组傻傻分不清/

许可协议: Attribution-NonCommercial 4.0

转载请保留以上信息。