C 语言指针右手定则

C 语言指针

#include<stdio.h>
int a;
int b[10];
int* p3[10];//指针数组
void func();

int main()
{
    //简单的
    int* p = &a;//第一种写法
    int** p1 = &p;//二级指针
    int(*p2)[10] = &b;//int(*p2)[10] = b;数组指针
    void(*p3)() = func;//函数指针

    //复杂的
    int (*(*(*p4)[10])(void))[10];

    return 0;
}

void func()
{
    printf("lalalalala");
}

详细分析一下这个复杂指针

右手定则 : 从 P4 开始, 大拇指指向自己, 拳心四指头形成一个环, 洞洞对着 P4, 四指逆时针旋转

从 P4 开始, 遇到了一个 *, 它是个指针, * 然后出去指向一个数组, 所以 P4 指针指向一个长度为 10 的数组, 然后数组里面装的是指针, 这样逆时针转过来

然后数组里面的这个指针指向 void 这个函数, 函数的返回值是啥, 我们再逆时针转, 函数返回值是一个指针

然后这个指针又指向一个长度为 10 的数组, 然后数组类型是 int


P4 首先是一个指针

P4* 脱掉 () 之后, 左侧有 * 右侧有 [], 而 [] 的优先级高于 * 的, 那么先与 [] 结合

然后继续逆时针转, 数组里装的是指针

这个数组里装的指针又指向一个函数, 函数返回值是指针, 函数参数是 void

函数返回值是指针, 这个指针又指向一个长度为 10 的数组 [10], 且数组数据类型是 int