本博客的特点是没有长篇大论(主要是写不出来),只记录一些小点,虽然零碎,但是有用。
今天这个话题想必是每个初学 C语言的同学都无法绕过的。下面简单介绍一下指针数组和数组指针的区别,再进行画图说明,最后给出示例代码。
指针数组:顾名思义,这是一个数组,它的每个元素都是一个指针。(这些指针指向相同类型的内存区域,这是数组的基本约束)
数组指针:顾名思义,这是一个指针,这个指针指向一个数组。(这个数组的每个元素类型都相同,这也是数组的基本约束)
下面用 type来表示具体使用的某个类型,它既可以很简单,也可以很复杂,在使用时,一定要能精准识别出来。
定义一个指针数组:
type *pointers[5] = {NULL, NULL, NULL, NULL, NULL};
定义一个数组指针:
type (*pointer)[5] = NULL;
形式上非常相似,但含义明显不同。
对于 type *pointers[5];实际上声明了一个含有 5个指针元素的数组,如下所示:

对于 type (*pointer)[5];实际上声明了一个指针变量,如下所示:

使用 sizeof()可以看的更明显一些,假设 type是最简单的 char类型,我们分别输出 pointers和 pointer的大小:
#include
int main(void)
{
char *pointers[5];
char (*pointer)[5];
printf("sizeof(pointers) = %d\n", sizeof(pointers));
printf("sizeof(pointer) = %d\n", sizeof(pointer));
return 0;
}
运行结果如下:
$ ./a.out
sizeof(pointers) = 40
sizeof(pointer) = 8
在我的机器上,指针大小是 8字节。
下面还是用 char类型来讲解一下它们的基本用法,当然,更复杂的类型也是支持的。这里的重点不在于类型有多复杂,而在于我们面对的具体问题。有时候,这两种用法都能解决同一个问题,但在内存访问的灵活性和便利性上有所不同,这时需要我们自己判断哪种用法更合适。
对于指针数组,我们可以这样用:
#define MAX_SIZE 5
void use_pointer_array(void)
{
int i = 0;
char *A[MAX_SIZE] = {
"Monday",
"Tuesday",
"Wednesday",
"Thursay",
"Friday"
};
for (i = 0; i < MAX_SIZE - 1; ++i)
printf("A[%d] = %s, ", i, A[i]);
printf("A[%d] = %s\n", i, A[i]);
}
输出结果是:
A[0] = Monday, A[1] = Tuesday, A[2] = Wednesday, A[3] = Thursay, A[4] = Friday
对于数组指针,我们可以这样用:
void use_array_pointer_1(void)
{
char (*B)[MAX_SIZE];
char C[MAX_SIZE] = "1234";
B = &C;
printf("(*B) = %s\n", (*B));
}
输出结果是:
(*B) = 1234
面对更复杂的问题,对于数组指针,我们还可以这样用:
void use_array_pointer_2(void)
{
char (*B)[MAX_SIZE];
char C[3 * MAX_SIZE] = "1234\0ABCD\0abcd\0";
B = (char (*)[MAX_SIZE])&C;
printf("B[0] = %s, B[1] = %s, B[2] = %s\n", B[0], B[1], B[2]);
}
输出结果是:
B[0] = 1234, B[1] = ABCD, B[2] = abcd