指针和数组间的不明关系

作为C语言中最重要的一部分,没有之一!那就让我们来聊聊指针和数组间千丝万缕的关系。

那么什么是指针什么又是数组呢?

指针: 通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为"指针"。

数组 : 它是具有相同的数据类型且按一定次序排列的一组变量的集合体,构成一个数组的这些变量称为数组元素。

有了这些概念我们来了解以下这些概念:

1,什么是指针数组?

简单的理解就是一个数组中的元素类型都是指针类型,通常我们是这样表示的一个一维指针数组的:"类型名 * 数组名[数组长度]"。

例如:int *ptr_array[5]

指针和数组间的不明关系

2数组指针是什么?

首先它是一个指针,它指向一个数组。在 32 位系统下永远是占 4 个字节, 至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。通常用这样的形式来表示数组指针:"类型名* 数组名数组长度]"。

例如:int (*ptr)[5]

指针和数组间的不明关系

3函数指针?

顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。

例如:char* (*fun1)(char* p1,char* p2)

这里 fun1 不是什么函数名,而是一个 指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指 针。同样,我们把这个表达式改写一下:char* (*)(char* p1,char* p2) fun1; 这样子是不 是好看一些呢?只可惜编译器不愿意这么想。

4函数指针数组又是什么鬼?

现在我们清楚表达式 “char* (*pf)(char* p)”定义的是一个函数指针 pf。既然 pf 是一 个指针,那就可以储存在一个数组里

于是就有了函数指针数组:

char* (*pf[3])(char* p)

这是定义一个函数指针数组。它是一个数组,数组名为 pf,数组内存储了 3 个指向函数的 指针。这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函 数。这念起来似乎有点拗口。不过不要紧,关键是你明白这是一个指针数组,是数组。

5指向函数指针数组的指针?

这里的函数指针数组指针不就是一个指针嘛。只不过这个指针指向一个数组,这个数组里面存的都是指向函数的指针

于是就有了这样变态的东西:

char* (*(*pf)[3])(char* p)

要怎么理解这个声明呢!

这里的 pf 和上面的 pf 就完全是两码事了。上面的 pf 并非指针,而是一个数组名; 这里的 pf 确实是实实在在的指针。这个指针指向一个包含了 3 个元素的数组;这个数组里面存的是指向函数的指针;这些指针指向一些返回值类型为指向字符的指针、参数为一个 指向字符的指针的函数。这比上一节的函数指针数组更拗口。其实你不用管这么多,明白 这是一个指针就 ok 了。其用法与前面的数组指针没有差别。


看到这里是不是学C语言的信心就只剩一半了?悄悄告诉你后面还有更变态的等着你呢,想成为一个C程序员真的不是一件容易的事,只要相信量变会引起质变就好,慢慢积累吧,等你被指针戳的遍体鳞伤的时候可能你就快成功了。