山峰云绕 / C语言 数据结... / C语言面试题详解(第9节),那么多人都能学...

0 0

   

C语言面试题详解(第9节),那么多人都能学会指针,因为他们聪明?

2020-02-20  山峰云绕


https://m.toutiaocdn.com/group/6660462059693539843/?app=news_article&timestamp=1582210557&req_id=20200220225557010026077195233CEE25&group_id=6660462059693539843


基本上,每个C语言工作者都认可指针非常重要。事实也的确如此,正是因为指针的存在,C语言才能如此灵活,才能在计算机编程语言几十年的发展中,始终占有一席之地。

C语言的设计宗旨是:相信每个C语言使用者都是高手,它给予程序员最大的自由,基本不会太限制程序员的发挥,再加上指针语法,C语言能够灵活的操作内存,是追求极致效率的不二之选。

然而,灵活也意味着容易出错,C语言也是一门对使用者基本功要求特别高的编程语言,否则就很容易开发出漏洞百出,或者隐患重重的程序。从某个程度上来说,C语言程序员与程序员之间的水平差异非常大,借助于指针,高手们能够轻易写出占用资源少,但是运行效率却非常高的程序。

而有些C语言初学者却认为指针是不可捉摸的,甚至有些仇视指针,觉得指针是一种古老的、不安全的设计,应该被摒弃。更有甚者,直接就放弃学习C语言了。但是,世界上那么多C语言程序员,他们都是聪明绝顶的吗?显然不是,他们都是和我们一样的普通人,只不过“闻道有先后”而已。其实C语言只是一种基础工具,指针并没有那么难,花点时间肯定能掌握。

先来看这个题目热热身

这个题目是我国台湾省某著名杀毒软件公司的一道面试题,请看C语言代码如下:

#include <stdio.h>int main(){ int max(x, y); int *p = &max; int a, b, c, d; printf('Please input three integer\n'); scanf('%d%d%d', a, b, c); d = (*p)((*p)(a, b), c); printf('Among %d, %d, and %d, the max integer is %d\n', a, b, c, d); return 0;} int max(int x, int y){ return x>y?x:y;}
上面这段C语言程序是有问题的,那么哪几行有问题呢?以及为什么呢?

分析

显然,这道题考的是C语言的语法,那么编译器就能协助我们定位错误,输入编译命令:

# gcc t1.c

得到如下提示信息,应该注意每一个警告和错误:

最明显的错误是第 5 行 max() 函数的声明,以及第 10 行 scanf() 函数的传参,这两点相信即使是C语言初学者也能轻易看出,就不赘述了,我们修正它:

...int main(){ int max(int, int);... scanf('%d%d%d', &a, &b, &c);...

再次编译,得到如下提示信息:

编译失败,提示我们 p 不是函数,也不是函数指针。这是当然的,p 是一个 int 型的指针,但是上面的C语言代码将 p 当成是函数指针,并让其指向 max() 函数了。修改之:

int *p = &max;// 修改为 int (*p)(int, int) = &max;

修改很简单,无非就是将 p 改为函数指针。再次编译修改后的C语言代码,并执行之,发现成功了:

# gcc t1.c# ./a.out Please input three integer1 2 3Among 1, 2, and 3, the max integer is 3

不要把指针“特殊化”

初学者看到“函数指针”这样的字眼,可能又有些烦了:以前知道有 int 指针,float 指针,后来知道还有数组指针,指针数组,指针函数,现在又来一个函数指针,指针到底有几种?这样想其实就把指针“特殊化”了,反而不利于理解指针。其实,只要把指针像 int、float 一样看作是C语言中的一种数据类型,似乎一切就很简单了。

int 指针是 int 类型的指针,它指向 int 型的整数,这很好理解。那相应的,数组指针是“数组类型”的指针,它指向数组;函数指针是“函数类型”的指针,它指向函数,仅此而已。int 数组是存放一系列 int 整数的数组,那指针数组就是存放一系列指针的数组;int 函数是返回 int 整数的函数,那指针就是返回指针的函数。可以看出,指针实在没有什么特殊的。

作为练习,再来看看下面这个面试题

这是美国某著名计算机嵌入式公司的一道面试题,请看C语言代码如下:

float(**def)[10];double*(*gh)[10];double(*f[10])();int*((*b)[10]);long (*fun)(int);int (*(*f)(int, int))(int);
问:上面这段C语言声明语句代表了什么?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。如发现有害或侵权内容,请点击这里 或 拨打24小时举报电话:4000070609 与我们联系。

    猜你喜欢

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多