【C语言指针】分析C语言复杂指针
前言
指针是一种保存变量地址的变量,简单指针容易分析,但是当指针稍微复杂,就很容易无从下手,比如:
char *(*(**foo[][8])())[];
1
下面将会由浅入深的探究指针
普通指针
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
int a = 1;
int * pa = &a;
int ** ppa = &pa;
printf("%p %d %p %p %d %p %p %d ", &a, a, &pa, pa, *pa, ppa, *ppa, **ppa);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
输出如下:
0000004d389ffa04 1 0000004d389ff9f8 0000004d389ffa04 1 0000004d389ff9f8 0000004d389ffa04 1
1
几点解释:
pa是指向int类型的指针,它的值是变量a的地址
ppa是指向pa的指针(二维指针)
占位符 %p 对应指针变量的值
&p指的是指针p在内存中的地址
运算符结合顺序
结合的优先级由大到小:() > [] > *
著名的右左法则:先看最里面的括号,再看右边,再看左边。每当你遇到括号,你应该改变你的阅读方向。解析完括号内的所有内容后,跳出括号。重复此过程,直到解决整个语句。
Right-Left Rule: First look at the innermost parenthesis, then look to the right, and then to the left. Whenever you encounter parentheses, you should switch your reading direction. Once you have parsed everything inside the parentheses, jump out of the parentheses. Repeat this process until the entire statement is resolved.
参考:https://blog.karatos.in/a?ID=00250-f7e0610c-459c-431a-a3ab-d9a50a7d5598
int* f();
由上述结合顺序得,f先和()结合
f 是一个函数 ,它的返回值是int* 类型,也即是指向int 类型的指针
int (* f)();
由于()的存在,f先和*结合,再和右侧的()结合
f是一个函数指针,它指向的函数的返回值是int类型
程序中的每个函数都位于内存中的某个位置,所以存在指向那个位置的指针
int* (* f)();
类似上述, f是一个函数指针,它指向的函数的返回值是指向int类型的指针
int *f[]
f是一个数组,该数组每个元素都是指向int类型的指针
int (*f)[10]
f是一个指针
指向一个int类型的数组,该数组有十个int类型的值
int ** f
可以参考【C语言指针】char* argv[] 、char **argv、命令行传参
int (*f[])();
f是一个数组
数组元素的类型是函数指针
函数的返回值是一个整型值
int *(*f[])();
f是一个数组
数组元素的类型是函数指针
函数的返回值是指向 int 类型的指针
int (*(*(*pfunc)(int *))[5])(int *)
pfunc是一个函数指针
函数的参数是指向int类型的指针
函数的返回值是一个指针,指向一个具有五个元素的数组,该数组的每一个元素都是一个指针
此指针指向一个函数,该函数的参数为int * ,返回类型为int
char *(*(**foo [][8])())[];
foo是一个二维数组,数组的每个元素都是指针,指向函数,函数返回一个指针,指向一个数组,该数组每个元素都是指向char类型的指针
cdecl 辅助分析
通过包管理器安装cdecl程序
$ sudo apt install cdecl
$ cdecl
cdecl> explain char *(*(**foo[][8])())[]
declare foo as array of array 8 of pointer to pointer to function returning pointer to array of pointer to char
1
2
3
4
5
6
7
————————————————
版权声明:本文为CSDN博主「郭同学如是说」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43864567/article/details/122778415