基础指针用法
- 众所周知,下面的一级和二级指针,是C语言里最经典的指针应用。
int *p = &a; //一级指针 int **q = &p; //二级指针
指针级数最多有多少
- C语言规范
规范本身并没有规定指针的级数,C语言语法ISO/IEC 9899:2018定义如下:
type-qualifier: const restrict volatile type-qualifier-list: type-qualifier type-qualifier-list type-qualifier pointer: * type-qualifier-list(opt) * type-qualifier-list(opt) pointer
从该词法定义上看, pointer是一个递归定义,没有限定 pointer 有多少级的
- 编译器角度
实际上的限制可能会取决于*,在当前编译器里能处理的栈的大小。因为在编译阶段,要把这个int ****** p这一类的东西做词法处理,******这个长度就可能会遇到当前处理栈的大小的问题。所以它的处理大小是取决于栈的大小的。
- 内存角度
指针级数过多,涉及大量的变量,可能会占用更多的内存,有可能会有内存的限制。
如何实现多级指针
- 这里仅以1000级指针为例来说明。
利用递归的宏来实现
- 下面这种方法,仅适用于级别为NNN(如8、64等)的情况:
#define P(x) x x x x x x x x x x int P(P(P(*))) p = NULL;
利用宏的堆叠来实现
- 这种方法,可根据需要实现不同级别的组合:
#define POINTER1 * #define POINTER5 POINTER1 POINTER1 POINTER1 POINTER1 POINTER1 #define POINTER10 POINTER5 POINTER5 #define POINTER50 POINTER10 POINTER10 POINTER10 POINTER10 POINTER10 #define POINTER100 POINTER50 POINTER50 #define POINTER500 POINTER100 POINTER100 POINTER100 POINTER100 POINTER100 #define POINTER1000 POINTER500 POINTER500 int POINTER1000 p =NULL;
小结
- 不提倡使用多级指针,一般使用多级指针的情况都可以通过其他方式来实现,本文仅简单探讨一下其实现方案。