作为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程序员真的不是一件容易的事,只要相信量变会引起质变就好,慢慢积累吧,等你被指针戳的遍体鳞伤的时候可能你就快成功了。