问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言 指针函数 函数指针 什么区别联系?最好有例子?一定采纳

发布网友 发布时间:2022-08-01 11:48

我来回答

4个回答

热心网友 时间:2024-12-12 07:50

没觉得指针函数这个概念有什么大的意义。。。。可能其最大的意义就是拿过来和函数指针一起混淆初学者的视听吧。


指针函数指的是返回一个指针的函数,比如我们常见的gets(),strcpy(),strcat(),malloc()等等。如果单独把它当成一个新概念真的没有什么意义。这些函数除了返回一个指针之外没有任何共性,但是返回的指针又天差地远。


下面说说函数指针。


指针分为三种类型:对象指针,函数指针和void指针。


函数指针的声明形式是T (*p)(...),其中*p使用括号括起来的原因是函数类型解析的优先级高于指针的解析,故使用括号防止解析成上面的指针函数(其实这两个之间就相差了一对括号)。


函数指针可以绑定到与其返回值和参数类型都相同的函数上。比如:

int foo(int, double); // 函数声明
int (*bar)(int, double) = foo; // 函数指针

在上面的初始化中,写成&foo也是可以的。


函数指针的最大特点就在于,其不能做一元+-运算(当然也不能做+= -= ++ --等),且对其做一元*运算的结果还是其本身。例如:(接着上面的例子)

bar(1,1.0);
(*bar)(1,1.0); // 两种情况等价

甚至你还可以这样:

(**************bar)(1,1.0);

依然是对的。

所以实际应用中一般采取类似函数调用的方式,这样更加自然。


刚刚去测试了一下,还有一个更加隐蔽的问题:

C中的函数可以采用使用原型或者不使用两种方式。(不使用原型被视为过时)

原型即在函数头中将参数类型及个数都声明,而不使用就是很简单的一对括号。例如:

int foo(); // 非原型
int bar(void); // 原型
int foo1(int); // 原型

这有什么影响呢?看一看下面的一段代码:

int foo(int i){return i;} // 原型
int foo1(double c){return (int)c;} // 原型
int bar(){return 1;} // 非原型

int main(void)
{
    int (*foobar)(int); // 原型
    int (*barfoo)(); // 非原型

    foobar = foo;
    foobar = &foo;
    foobar = bar;
    foobar = foo1; // this

    barfoo = foo;
    barfoo = bar;
    barfoo = foo1;

    foobar(1);
    (*foobar)(1);
    (*************foobar)(1);

    return 0;
}

我的编译器对this指的一行进行了警告,提醒指针类型不匹配。

我们可以看到,非原型的函数指针可绑定到任意的函数上,而带有原型的函数指针在绑定时可以起到更严格的类型*。

容易忽略的一点是,不接受任何参数的函数(带原型)的声明方式是int foo(void);,不应该省略void,特别是在使用对应类型的函数指针时,如果省略void,那么错误的绑定也不会被警告。


我还注意到了一个现象:

int foo(char);
int (*bar)() = foo;

这段代码同样也给了警告。为什么呢?

因为在不使用原型的情况下,char,short,float等会被隐式提升到与其对应的更高级类型。

而在这个绑定中,bar是非原型,这时可能会进行整型提升,而foo带有原型,调用时不需要进行提升。这样就有可能引发错误。


以上就是函数指针使用过程中需要注意的一点。不过提醒LZ,函数指针使用过程中最好还是使用带有原型的函数指针。

热心网友 时间:2024-12-12 07:51

函数指针常见的例子就是:一个函数的函数名。eg:
int fun (int a, int b) {
return a + b
}
fun就可以叫做这个函数的函数指针。
当然,我们也可以自己定义一个函数指针变量指向fun。eg:
int (fp* ) (int ,int) (它定义格式有点奇怪,不过没办法) fp 就是一个 int (*) (int, int) 类型的函数指针。fp = fun; 然后可以再其他函数里面调用了.
假设
int main (void) {
int sum = fd (1, 2); //等价于 int sum = fun (1, 2);
printf ("sum = %d\n", sum);
return 0;
}
void function ( void) 这个函数的函数指针是function, 如果我们想用一个函数指针来指向function,必须要类型一致,包括函数返回类型和 形参格式。

指针函数指的是函数返回值是个指针,本质是个函数。eg:
假设有一个数组int arr[length]
int* function (int* arr, int length) {
int* tmp;
sum = arr + 1;
return sum;
}
这个返回值是指向arr[length] 第二个元素的地址。

大概就想到这些。。

热心网友 时间:2024-12-12 07:51

指针函数 本质上是一个函数,只不过函数的返回值是指一个指针,比如定义 int *func(int );
函数指针 本质上是一个指针,只不过指针指向的是一个函数,比如定义 int (*p2func)(int );

热心网友 时间:2024-12-12 07:52

让我考虑考虑!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
笔记本电脑的哪些牌子什么牌子的笔记本电脑好 笔记本电脑品牌质量排行榜你知道哪个最耐用全面解析笔记本电脑品牌的质 ... 十大笔记本电脑品牌笔记本电脑推荐品牌 各大汽车电脑品牌厂家官方售后服务电话合辑v3.00 哪种笔记本电脑售后好哪个品牌电脑售后好 各大笔记本电脑品牌售后网点及售后电话汇总解决您笔记本电脑问题的选 ... 如何教育孩子成学霸 学霸的家长是怎样培养孩子的? 聪明的懒孩子怎么变成学霸 学霸孩子怎么培养 关于c语言的指针函数 中国人民大学和清华大学,北京大学,各有什么特点,用自己的话评价一下... 膝盖有什么特别的意义吗? 孙膑受膑刑被剜去膝盖骨,请问膝盖骨有什么作用?没有膝盖骨是什么症状... 昨晚梦到我的口红断了预示什么? 灵通6600恢复出厂设置? 为什么红米NOTE十更新了MIUI十二点零八后会没有声音? 闲鱼上卖的打印机为什么不带线 VC++能编写C语言吗 VC++中可以写C语言吗(或者说,C与C++兼容吗) 红米note屏幕很暗,白天看不清,移动调节还是这样!是怎么回事? 本人想开一个机械加工厂,准备买两台车床一台铣床。最好可以分期付款的... 如何选择一个好的二手铣床? 二手数控铣床 无人机去挂闲鱼应该填什么分类? 凉鞋应该怎么搭配 闲鱼买的无人机卖家不退款 聚乙烯面料的车衣和牛津布面料的车衣哪一款好? ...的英语单词结构在不同的英语单词里会有不同的发音啊?有什么规律吗... 8·0.15微信有什么好处呢 为什么c语言是编程的首选语言 奥运会有武术这个项目吗? 奥运会的比赛项目有没有武术? C语言编程初学问题 奥运会里有没有武术项目? 什么是嵌入式系统?原理是 武术已经成为奥运会比赛项目了吗? 北京奥运会有武术这个比赛项目吗? 梦见一盆花枝干干了? 51单片机C语言应用开发技术大全下载 河南省驻马店交通高级技工学校怎么样? 红米note8pro外置sd卡根目录路径 红米note8SD卡访问权限 ps5陨落的武士团怎么开60帧 对马岛之魂支持120hz吗 ps5迈尔斯怎么换光追模式 有担保公司给办信用卡,额度最高是多少 用有限责任公司办理信用卡的额度有多少? 在深圳公司要怎样办理信用卡,额度有多高? ps5日版怎么登录港服?