前言
正文
由于很容易搞混,因此这里做一下记录。
指针数组
指针数组是指具有若干个相同存储类型和数据类型的[指针变量]构成的组合。
指针数组的一般形式:
存储类型 数据类型 * 指针数组名 [大小]
//指针数组,类型是int * 所以叫int型指针数组
int * p[n];
// int型数组
int array[n]
[]的优先级比*高,所以p先是一个数组,在int * 组合说明是一个整型指针数组,含有n个指针类型的数组。
数组中存储的就是指针
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32 位系统下任何类型的指针永远是占4 个字节。它是“储存指针的数组”的简称。
#include<stdio.h>
int main(){
int a[2][2]= {{1,2},{3, 4}};
for( int i=0; i< 2; i++){
for( int j=0; j< 2; j++){
printf("%d \n ", a[i][j]);
}
}
printf("\n");
int * q[2];
q[0] = a[0];
q[1] = a[1]; //不指定q[1]就没法查询到a[1]的内容
for( int i=0; i< 2; i++){
for( int j=0; j< 2; j++){
printf("%d \n ", q[i][j]);
}
}
return 0;
}
输出结果:
1
2
3
4
1
2
3
4
数组指针
行指针,也就数组指针。存储行地址的指针叫行指针变量。
一般的形式如下:
存储类型 数据类型 (* 行指针变量)[大小]
比如:
int (*p)[n];
()的优先级比[]高,说明p是一个指针,指向一个整型的一为数组,这个一维数组大小为n。
数组指针:首先它是一个指针,它指向一个数组。在32 位系统下任何类型的指针永远是占4 个字节,至于它指向的数组占多少字节,不知道,具体要看数组大小。它是“指向数组的指针”的简称。
个人觉得,数组指针,可以看成存在类型为int的二维数组
#include<stdio.h>
int main(){
int a[2][2]= {{1,2},{3, 4}};
for( int i=0; i< 2; i++){
for( int j=0; j< 2; j++){
printf("%d \n ", a[i][j]);
}
}
printf("\n");
int (*p)[2]; //类型为int的数组指针
p =a ;
for( int i=0; i< 2; i++){
for( int j=0; j< 2; j++){
printf("%d \n ", p[i][j]);
}
}
return 0;
}
输出的结果:
1
2
3
4
1
2
3
4
小结:
- 数组指针和指针数组赋值存在一定的区别。
指针数组:
int * q[2]; // 存储的类型为int *指针
q[0] = a[0];
q[1] = a[1]; //不指定q[1]就没法查询到a[1]的内容
数组指针:
int (*p)[2]; //类型为int的数组指针
p =a ;
- ()的优先级比[]高,[]比*高,所以导致存储的类型不一样。
PS 以上面例子
指针数组:存放的是int *
数组指针:存放的是int
谁的优先级高就读法就放在后面,比如指针数组中[]的优先级高于*;比如数组指针中的(int *)高于[]。
- 如果指针在最后,说明这个是指针,用于指向某个地址的;
- 如果数组在最后,说明这个是数组,用于存储指针的数组,数组类型为int *;
参考文章
- 《数组指针和指针数组的区别》
- 等
(1)如果指针在最后,比如数组指针,说明这个是指针,用于指向某个地址的;(2)如果数组在后,说明这个是数组,用于存储指针的,也就是数组类型为int *