c語言複雜指針表達式分析

函數指針—指向函數的指針:

#include <stdio.h>
int fun1(int a)
{
    printf("%d\n",a);
    return 8;
}
int main()
{
    //函數指針(指向函數的指針)
    int (*p1)(int);
    p1 = fun1;
    int res = p1(3);                  //3
    printf("函數指針返回值:%d\n",res); //8
    return 0;
}

指向的函數返回值爲 指向int的指針

#include <stdio.h>
int m = 2;
int *fun2(int a)
{
    printf("%d\n",a);
    return &m;
}
int main()
{
    //函數指針  指向的函數返回值爲指針   指針指向int
    int *(*p2)(int);
    p2 = fun2;
    int *p22 = p2(3);             //3
    printf("m的值:%d\n",m);       //2
    printf("函數指針返回值  指向的值: %d\n",*p22); //2
}

指向的函數返回值爲 指向數組的指針

#include <stdio.h>

// 返回指向數組的指針   數組名可以理解爲地址
// 指向指針的指針 還是一個指針嗎,指針是怎麼返回的就怎麼返回
int* *fun(int a)      //int *fun(int a)也可以  總之都是地址(地址存的是什麼看main怎麼用)
{
    printf("%d\n",a);
    static int b[3] = {1,2,3};
    int(*p2)[3] = &b;
    return p2;
}
int main()
{
    //函數指針  指向的函數返回值爲指針   指針指向int[3]

    int (*(*fp1)(int)) [3];
    fp1 = fun;

    int(*p)[3] = fp1(2);    //2

    printf("%d\n",(*p)[0]);     //1
}

指向的函數返回值爲 指向指針的指針

#include <stdio.h>
int m = 11;
//  指向的函數返回值爲 指向指針的指針
int* *fun(int a)    //int *fun(int a) 也可以
{
    printf("%d\n",a);
    static int *p1 = &m;
    int **p2 = &p1;
    return p2;
}
int main()
{
    //*(*fp1)(int)  返回值爲指針
    int *(*(*fp1)(int));    //指針指向  int*
    fp1 = fun;

    int **p = fp1(2);       //2

    printf("%d\n",*(*p));   //11
}

指向的函數返回值爲 指向函數的指針:

#include <stdio.h>
//  指向的函數返回值爲 指向函數的指針
int base(int a)
{
    printf("%d\n",a);
    return 4;
}
int *fun(int a)
{
    printf("%d\n",a);
    int (*p1)(int);
    p1 = base;
    return p1;
}
int main()
{
    //*(*fp1)(int)  返回值爲指針
    int (*(*fp1)(int)) (int);    //指針指向  int*
    fp1 = fun;
    int (*p1)(int) = fp1(2);      //相當於執行了 p1 = base;   //  結果:2
    int m = p1(44);             //結果:44
    printf("%d\n",m);           //結果:4
}

整理總結:

*p1;
指針p1;

int (*p1)(int);
指向函數的:符號p1後要有()()裏面是函數入參,右邊是返回值類型;

int *(*p2)(int);
返回值是指針類型:會在 (*p1)左側加 *;且*是右結合的,若要加括號:int (*(*p2)(int));

int (*(*fp1)(int)) [3];
返回的指針指向數組時:[]加在右邊;

int *(*(*fp1)(int));
返回的指針指向指針時:*加在左邊;

int (*(*fp1)(int)) (int);
返回的指針指向函數時:在右邊加括號表示函數的入參;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章