知识点回顾:
1. 指针和数组的区别
· 指针是左值(什么是 lvalue,什么是 rvalue?);
· 而数组名只是一个地址常量,它不可以被修改,所以数组名不是左值。
2. 指针数组
int *p1[5];
上边是一个指针数组,我们可以从运算符的优先级和结合性进行分析:
数组下标的优先级要比取值运算符的优先级高,所以先入为主,p1 被定义为具有 5 个元素的数组。那么数组元素的类型呢?是整型吗?显然不是,因为还有一个星号,所以它们应该是指向整型变量的指针。
如下图所示:
结论:指针数组是一个数组,每个数组元素存放一个指针变量。
指针数组演示:
#include <stdio.h>
int main()
{
char *p1[5] = {
"让编程改变世界 -- 鱼C工作室",
"Just do it -- NIKE",
"一切皆有可能 -- 李宁",
"永不止步 -- 安踏",
"One more thing... -- 苹果"
};
int i;
for (i = 0; i < 5; i++)
{
printf("%s\n", p1[i]);
}
return 0;
}
[fishc@localhost s1e23]$ gcc test3.c && ./a.out
3. 数组指针
int (*p2)[5];
上边是一个数组指针,我们同样可以从运算符的优先级和结合性进行分析:
因为圆括号和数组下标位于同一个优先级队列,所以我们就要看先来后到的问题了。由于它们的结合性都是从左到右,所以 p2 先被定义为一个指针变量。那么它指向谁?还能有谁?后边还紧跟着一个具有 5 个元素的数组,p2 指向的就是它。由于指针变量的类型事实上就是它所指向的元素的类型,所以这个 int 就是定义数组元素的类型为整型。
如下图所示:
结论:数组指针是一个指针,它指向的是一个数组。
数组指针演示:
#include <stdio.h>
int main()
{
int temp[5] = {1, 2, 3, 4, 5};
int (*p2)[5] = &temp;
int i;
for (i = 0; i < 5; i++)
{
printf("%d\n", *(*p2 + i));
}
return 0;
}
[fishc@localhost s1e23]$ gcc test4.c && ./a.out
1
2
3
4
5




