首页 > 其他 > 详细

指针理解

时间:2021-05-21 22:20:01      阅读:19      评论:0      收藏:0      [点我收藏+]

对于指针的一些理解

昨天看到这样的函数——技术分享图片,我是比较蒙蔽的,为此我找寻大量的资料,才理解一点点。

分析

首先要理解函数指针的概念,函数指针的意思是通过声明一个指针达到操控函数的目的。
一个函数名就是该函数的入口地址,所以我们把该函数名赋值给一个函数指针就可以调用该函数。下面用一个例子讲解。

#include <stdio.h>
#include <stdlib.h>
/*声明一个函数指针,变量名为fun*/
void (*fun)(int,int);

void sum(int x, int y)
{
    printf("%d\n", x+y);
}

int
main(void)
{
/*
  取sum函数的地址即&sum;
  也可以写成fun = sum ;
*/
    fun = &sum;
/*取出sum函数的入口地址。*/
    (*fun)(2, 3);
    return 0;
}

以上就是函数指针的一个简单例子,现在我们分析下函数指针的类型。我查寻资料得知,一般来说,可以声明出一个表达式,就可以写出它的类型。只需要去掉变量名和“;”,就可以得到该表达式的类型。故上面代码中的函数指针的类型为

void (*)(int, int)

不知道你们看起来怪不怪,我看着十分别扭,不能接受,因为我在想那指针函数的类型岂不变成了

void *()

我最后想出一个我认为比较合理的理由,函数指针本质是一个指针,只是这种类型我以前不知道而已;而指针函数本质是一个函数,所以类型中包括有“()”的!!! ((doge))

验证我的结论

#include <stdio.h>
#include <stdlib.h>

typedef int  (*fun)(int);

//int (*test)(int);

int Print(int num)
{
        int a;
        return num;
}

int
main(void)
{
        printf("%d\n",sizeof(int *));
        printf("%p\n",sizeof(int ));
        //
        printf("%p\n",sizeof(void *()));//结果是0x1
        printf("%p\n",sizeof( main));//结果是0x1
        printf("%d\n",sizeof(int (*)()));
        printf("%d\n",sizeof(int *[2]));
        printf("%d\n",sizeof(int (*)[2]));
        printf("%d\n",sizeof(int **));
        printf("%p\n",Print);
        return 0;
}

根据网友解释,sizeof对一些无意义参数取值时,会得到0x1。

最后顺便记录下typedef关键字

以前只知道typedef只是用来起别名,没在意别名的位置可以在中间或者后面。

  • typedef int size_t;//size_t就是别名,在最后。
    size_t a 相当于 int a;
  • typedef int (fun)() ; //fun就是别名,在中间
    fun p 相当于 p 是一个int (
    p)();理论上我们可以通过 int (*)() p 声明,但是编译器无法识别。

总的来说typedef起的别名就是变量名的位置


本人第一次接触这种语法,还是很难接受!!!

指针理解

原文:https://www.cnblogs.com/cwhan/p/14797152.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!