巧记“指针数组”与“数组指针”
指针数组:存放指针的数组
char *(week)[7] = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
数组指针:指向数组的指针
int arr[2][3] = { {1,1,1},{2,2,2} };
指针数组与数组指针在网上有很多很好的文章,但每次看过不久后就又忘掉了,这两个概念非常容易弄混,一不小心就会弄错。所以,在此中总结了几个快速记忆的方法,只为快速区分两者,不涉及更深层次的内容。因为是助记,所以以下内容可能不太准确,只为记忆方便,建议理解其概念后阅读。
分析:
数组指针
- 数组在前,强调了数组,表示可以存放二维数组。而二维数组中,有多个一维数组,可以理解为,多个指针。
- 总结:存放二维数组,二维数组中有多个指针
指针数组
- 指针在前,强调指针,表示可以存放指针(eg:字符串)。多个这样的指针组成数组
- 总结:存放指针(或者理解为存放字符串),多个指针形成数组
快速辨别
利用指针与数组的特征快速辨别,数组 int arr[] 特征为数组名旁边的括号,指针 char *p 特征为指针名前的 * 符号
数组指针
char (*p)[9] 这种形式,
1.数组角度:有两个括号,理解为两个数组,强调了数组,所以是数组+指针
2.指针角度:括号把 * 括在里面,从整体上看没有指针的特征“ * ” ,所以是数组+指针
指针数组
char *p[9] 这种形式
1.数组角度:一个括号,没有强调数组,所以是指针+数组
2.指针角度:从整体上看,有一个 * ,所以是指针+数组
总结:只看p,
p有*是指针--指针数组 char *p[]
p有()是数组--数组指针 char (*p)[]
实例:
int main()
{
//指针数组测试 存放指针,形成数组
const char* (week)[7] = { "Monday","Tuesday",
"Wednesday","Thursday","Friday","Saturday","Sunday" };
for (int i = 0; i < 7; i++)
{
printf(*(week + i));
puts("");
}
//数组指针测试 存放二维数组
int arr[2][3] = { {1,1,1},{2,2,2} };
int(*p)[3] = arr;
for (int i = 0; i < 6; i++)
{
printf("%d \n", (*p)[i]);
}
}
输出为:
//指针数组
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
//数组指针
1
1
1
2
2
2