指针理解

Posted cw_T

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针理解相关的知识,希望对你有一定的参考价值。

对于指针的一些理解

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

分析

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

#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起的别名就是变量名的位置


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

以上是关于指针理解的主要内容,如果未能解决你的问题,请参考以下文章

金蝶handler中 collection 代码片段理解

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

如何理解这段代码片段中的两对括号?

片段中的空指针异常

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解

活动到片段通信:当我尝试从活动更新片段中的文本视图时,出现空指针异常