指针数组和数组指针
先看两者之间的定义
int *p1[5]; //指针数组
int (*p2)[5]; //数组指针
经常有人把两者搞混。我们可以使用符号的优先级来帮助我们理解。在上面第一行代码中。[]的优先级高于*号,所以p1首先是数组,而类型是(int *)也就是一个存放指针的数组。而第二行()的优先级高于[],所以优先申明这是一个指针,然后指向一个大小为5的int数组,5也可以说是p的步长。
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32 位系统下任何类型的指针永远是占4 个字节。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在32 位系统下任何类型的指针永远是占4 个字节,至于它指向的数组占多少字节,不知道,具体要看数组大小。它是“指向数组的指针”的简称。
具体情况看下面这段代码
int main()
{
int a[4][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ,12};
cout << a << endl; //输出数组a的地址
cout << a[1] << endl; //输出a[1]行的首地址
cout << a+1 << endl; //输出a[1]行的首地址
cout << *(a+1) << endl; //输出a[1]行的首地址
cout << (a+1)[1] << endl; //输出a[2]行的首地址
cout << a[2] << endl; //输出a[2]行的首地址
cout << *(*(a+1)+1) << endl; // 输出a[1][1]的值
cout << (*(a+1))[1] << endl; // 输出a[1][1]的值
cout << endl;
int *p1[4]; //指针数组
for(int i=0; i<4; ++i)
p1[i] = a[i]; //从这里可以看出数组元素就是一个指针
cout << sizeof(p1) << endl; //看下p1的大小,在64位系统一个指针是8个字节
cout << *(p1[1]+1) << endl << endl; //访问a[1][1],用法和上面*(*(a+1)+1)有点类似
int (*p2)[3] = a; //定义数组指针
cout << sizeof(p2) << endl; //由于p2是指针,所以是8个字节
cout << a << endl; //a的地址
cout << p2[0] << endl; //a的地址
cout << (*p2)[0] << endl; //a[0][0]
++p2;
cout << (*p2)[0] << endl << endl; //输出a[1][0]这两行代码也可以看出数组指针为什么被叫做行指针
return 0;
}
输出结果:
0x7ffe51ef0a50
0x7ffe51ef0a5c
0x7ffe51ef0a5c
0x7ffe51ef0a5c
0x7ffe51ef0a68
0x7ffe51ef0a68
5
5
32
5
8
0x7ffe51ef0a50
0x7ffe51ef0a50
0x7ffe51ef0a5c
0x7ffe51ef0a5c
1
4
0x7ffe51ef0a20
0x7ffe51ef0a20
1
0x7ffe51ef0a24
用下面的图片来描述这两者之间的关系:
参考文章:数组指针和指针数组的区别
想交流的可以加我公众号: