Fantacity

Stand Alone Complex

C++ 中指针数组与数组指针

前言

C++当中指针是一个比较玄乎的东西,一段时间不用就弄不清楚了,昨天做笔试题目的时候就吧指针数组和数组指针搞混了。所以说,好记性不如烂笔头,重要的东西还是应该梳理一下整理下来,便于以后回顾。

>

指针数组
——–
指针数组: array of pointers,翻译成英文就比较好理解,其本质是一个数组,用于存储指针。

int *p[4]: 由于[]的优先级较高,所以p先和[]结合,表示这是一个数组,再由int*说明这是一个整形指针数组,数组的容量为4。

数组指针
——–
数组指针: a pointer of an array,其本质是一个指针,指向一个数组。

int (*p)[4]: 由于()的优先级更高,所以p先和*结合表示p是一个指针,指向一个int数组,其容量大小为4.

几个例子
———
第一个例子
int int_array[] = { 1, 2, 3, 4 };
int *a[4]; // a是指针数组
int(*b)[4] = &int_array; // b是数组指针
for (int i = 0; i < 4; ++i)
{
a[i] = &(*b)[i]; // 把b中每一个元素的地址赋值给a
}

输出内容

0018FA14
0018FA18
0018FA1C
0018FA20

注意

定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址。

第二个例子
int c[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
int(*d)[4] = c; // 或&(c[0])
d++; // 该语句执行过后,也就是d=d+1;d跨过行c[0]指向了行c[1]
for (int i = 0; i < 4; ++i)
{
cout << (*d)[i] << " ";
}

输出内容:

5 6 7 8 4 4

注意

注意和上例中的区别,int(*d)[4] = c; 这里不可以加&, 即&(c[0]) = c,这里c的含义应该为指向一个“一维数组的指针”,等同于上例中&int_array(指向一个以为数组的指针)。

第三个例子
cout << sizeof(a)/sizeof(a[0]) << " " << sizeof(b) << endl;

输出内容:

4 4

sizeof(a)/sizeof(a[0]) 得到的是数组的长度,即4;
sizeof(b) 得到的是一个指针的大小,在32位系统下是4(byte)

总结

最后总结两句话:

  1. 优先级 ()>[]>*
  2. 定义了指针一定要知道指针指向哪里,不然要悲剧。