指针理解
Posted cw_T
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针理解相关的知识,希望对你有一定的参考价值。
对于指针的一些理解
昨天看到这样的函数——,我是比较蒙蔽的,为此我找寻大量的资料,才理解一点点。
分析
首先要理解函数指针的概念,函数指针的意思是通过声明一个指针达到操控函数的目的。
一个函数名就是该函数的入口地址,所以我们把该函数名赋值给一个函数指针就可以调用该函数。下面用一个例子讲解。
#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函数的地址即∑
也可以写成fun = sum ;
*/
fun = ∑
/*取出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起的别名就是变量名的位置
本人第一次接触这种语法,还是很难接受!!!
以上是关于指针理解的主要内容,如果未能解决你的问题,请参考以下文章
调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段