【C语言指针】分析C语言复杂指针

前言

指针是一种保存变量地址的变量,简单指针容易分析,但是当指针稍微复杂,就很容易无从下手,比如:

char *(*(**foo[][8])())[]; 

下面将会由浅入深的探究指针

普通指针

#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;
}

输出如下:

0000004d389ffa04 1 0000004d389ff9f8 0000004d389ffa04 1 0000004d389ff9f8 0000004d389ffa04 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
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值