指针数组以及指向指针的指针

指针数组是由指针组成的数组。

1
char *lineptr[MAXLINES];

它表示 lineptr 是一个具有 MAXLINES 个元素的一维数组,其中数组的每个元素是一个指 向字符类型对象的指针。也就是说,lineptr[i] 是一个字符指针,而 *lineptr[i] 是该指针指向的第 i 个文本行的首字符。

多维数组

1
2
3
static char daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

在 C 语言中,二维数组实际上是 一种特殊的一维数组,它的每个元素也是一个一维数组。

如果将二维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数。因为函数调用时传递的是一个指针,它指向由行向量构成的一维数组,其中每个行向量是具有 13 个整型元素的一维数组。

所以可以写成如下形式:

1
2
3
f(int daytab[2][13]) { ... }
f(int daytab[][13]) { ... }
f(int (*daytab)[13]) { ... }

指向函数的指针

在 C 语言中,函数本身不是变量,但可以定义指向函数的指针。这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值等等。

1
int (*comp)(void *, void *)

它表明 comp 是一个指向函数的指针,该函数具有两个 void * 类型的参数,其返回值类型为 int。

1
if ((*comp)(v[i], v[left]) < 0)

comp 的使用和其声明是一致的,comp 是一个指向函数的指针,*comp 代表一个函数。下列
语句是对该函数进行调用:

1
(*comp)(v[i], v[left])

其中的圆括号是必须的,这样才能够保证其中的各个部分正确结合。

【参考资料】

  1. C程序设计语言

—EOF—