C语言面试题每日一练(一)[通俗易懂]

C语言面试题每日一练(一)[通俗易懂]C语言作为嵌入式Linux开发的必备工具,作为嵌入式Linux开发的基础语言,那么在面试嵌入式工程师时C语言定是面试中的重中之重。作为一名开学就大三的老学长,不得不为找工作做必要准备。每天做一道C语言面试题,并且能够融会贯通。2020.8.5题目描述:    在未排序的数组中找到第k个最大元素。请注意,你需要找的是数组排序后的第k个最大的元素而不是第k个不同的元素。示例1:输入:32.

大家好,又见面了,我是你们的朋友全栈君。

       C语言作为嵌入式Linux开发的必备工具,作为嵌入式Linux开发的基础语言,那么在面试嵌入式工程师时C语言定是面试中的重中之重 。作为一名开学就大三的老学长,不得不为找工作做必要准备。每天做一道C语言面试题,并且能够融会贯通。
Alt

2020.8.5

题目描述:
       在未排序的数组中找到第k个最大元素。请注意,你需要找的是数组排序后的第k个最大的元素而不是第k个不同的元素。

示例 1:
输入:3 2 1 5 6 4和 k=2
输出:5

示例 2:
输入3 2 3 1 2 4 5 5 6和 k=4
输出:4

题目分析:
       这道题主要考察的是排序的相关知识,通过给一个数组进行排序然后再找出第k大的元素并返回就可以了。
解题代码:

#include <stdio.h>
void swap(int *a,int *b)
{ 
   
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
int find_kth_largest(int *nums,int numsize,int k){ 
   
    //冒泡排序
    int i,j;
    for(i=0;i<numsize;i++)
    { 
   
        for(j=i+1;j<numsize;j++)
        { 
   
            if(nums[i]<nums[j])
                swap(&nums[i],&nums[j]);
            
        }
    }
    return nums[k-1];
}
int main(int argc,const char *argv[])
{ 
   
    int arr[10]={ 
   1,3,6,5,4,8,9,3,0,2};
    int tmp;
    tmp=find_kth_largest(arr,10,3);
    printf("%d\n",tmp);
    for(int i=0;i<10;i++)//排序结果输出,看排序是否正确
        printf("%d ",arr[i]);
    return 0;
}

2020.8.6

题目描述
       以下程序的输出结果是什么?

#include<stdio.h>

#define max(a,b) ((a)>(b)?(a):(b))

int main(void)
{ 
   
	int x[5]={ 
   0,2,1,3,-1};
	int biggest=x[0];
	int i=1;
	while(i<5)
	{ 
   
		biggest=max(biggest,x[i++];	
	}
	printf("%d\n",biggest);
}

题目分析:
       本题主要考察了宏定义、三目运算符、变量自增相关知识。

       #define 是用来定义宏的,在编译的时候,编译器会把代码中 max(a,b)都替换成 (a>b?a:b)。三目运算符 ( (exp1) ? exp2 : exp3 ) 的意思是,如果dao 表达式exp1的值为真,则返回表达式exp2,否则返回表达式exp3。所以 (a>b?a:b) 的意思是 如果a的值大于b,就返回a的值,否则返回b的值。

第一步:
biggest=x[0]
biggest=(x[0]>x[i++]?x[0]:x[i++]) //i++是先赋值后运算
              值为x[1]    值为x[2]
                i=2        i=3
biggest=(x[0]>x[1]?x[0]:x[2]//0>2?0:1
此时biggest的返回值为x[2],既为1

第二步:
biggest=x[2]
biggest=(x[2]>x[i++]?x[2]:x[i++])
             值为x[3]    值为x[4]
               i=4        i=5
biggest=(x[2]>x[3]?x[2]:x[4]//1>3?1:-1
此时biggest的返回值为x[4],即为-1

题目结果:

输出结果为:  -1

2020.8.7

题目描述

       有定义:typedef int (* p)(char,int); 请描述这个语句含义

题目解析

       声明一个函数指针类型的新名字为p,要求此类型满足指向函数返回值为int,形参为两个,分别是char和int。在此处函数的名字并不需要固定,所以不需要声明在类型里typedef原类型 新类型的名字

2020.8.8

题目描述:

       【面试题-是陷阱么?】32位系统中,下面代码,请说出*ptr1,*ptr2的值。

int a[4] = { 
   x, y, z, m};

int *ptr1 = *(a + 1);

int *ptr2 = (int *) ((int)a + 1);

题目解析:

       本题需要注意给指针赋值的方式,在定义时给其赋值,定义以后赋值的方式,以及数组名代表首元素的地址。同时,还要注意打印的是对应指指针变量的值还是地址。

赋值方式1int a[4] = { 
   1, 2, 3, 4};
	int *ptr1=a;//ptr1指向a[0]
赋值方式2int *ptr1;
	ptr1=a;
赋值方式3:
	int *ptr1=&a[0];	

注意:当在指针变量赋值为数字,会默认将数字认定为地址,那么该指针就是指向该地址。

#include<stdio.h>
int main()
{ 
   
	int *ptr=64;
	printf("ptr:%x\n",ptr);//打印ptr指向的地址
}

       运行程序发现打印的结果是:ptr:64

       通过在编译器下运行以下代码:

#include<stdio.h>
int main()
{ 
   
    int a[4]={ 
   1,2,3,4};
    int *ptr1=*(a+1);
    int *ptr2=((int)a+1);
    printf("ptr1 = %x\n",ptr1);
    printf("ptr2=%x\n",ptr2);
    printf("a+0=%x a+1=%x ",a+0,a+1);
}

输出结果为:

ptr1 = 2
ptr2=61ff09
a+0=61ff08 a+1=61ff0c

       可以明显的看出打印的结果为ptr1和ptr2对应指向的地址。int *ptr1=*(a+1);是将*(a+1)指向的值(2)当做地址赋值给ptr1,故打印的值为2。int *ptr2 = (int *) ((int)a + 1);是将数组元素的第一个地址(a[0]的地址)强制转换为整形然后加一赋值给ptr2。因此打印的值比a[0]的地址大一。

2020.8.9

题目描述:
       头文件中的ifndef/define/endif干什么用的?
题目解析:
       在c语言中,对同一个变量或者函数进行多次声明是不会报错的。所以如果h文件里只是进行了声明工作,即使不使用# ifndef宏定义,多个c文件包含同一个h文件也不会报错。同时可以防止头文件重复调用、部分语法重复声明定义。

2020.8.10

题目描述:

#include <stdio.h>
int fun( int x )
{ 
    
    int p;
    if (x == 0|| x == 1 ) 
        return(3);
    p = x - fun( x – 2 );
    return(p);main()
{ 
   
    printf ("%d\n",fun(9));
}

       程序运行后输出结果是?

题目解析:
       本题考察的函数的递归调用,func(9) = 9 – func(7), func(7) = 7 – func(5),func(5) = 5 – func(3),func(3) = 3 -func(1),又因为func(1) = 3, 所以 func(3) = 0, func(5) = 5 ,func(7) = 2 ,func(9) = 7

       不积小流无以成江河,不积跬步无以至千里。而我想要成为万里羊,就必须坚持学习来获取更多知识,用知识来改变命运,用博客见证成长,用行动证明我在努力。
       如果我的博客对你有帮助、如果你喜欢我的博客内容,记得“点赞” “评论” “收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159282.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Unity零基础到入门 ☀️| 游戏引擎 Unity 从0到1的 系统学习 路线【全面总结-建议收藏】![通俗易懂]

    Unity零基础到入门 ☀️| 游戏引擎 Unity 从0到1的 系统学习 路线【全面总结-建议收藏】![通俗易懂]Unity基础知识学习,Unity学习路线总结。本篇文章对Unity的学习路线做了一个全面系统的总结,对Unity有兴趣的小伙伴福利到了!敬请品尝~

    2022年6月12日
    31
  • java保留两位小数输出,看这篇文章准没错!

    java保留两位小数输出,看这篇文章准没错!4年经验应该具备哪些技能首先,简单的聊一下我认为的4年经验左右、优秀的Java程序员应该具备的技能有哪些,按“专业技能”和“项目”两块,包括但不限于以下内容。专业技能方面基础:JDK常用类的原理、源码、使用场景。设计模式:常用几种的原理、使用场景,单例、动态代理、模板、责任链等。数据结构:数组、链表、栈、队列、树。网络:TCP、HTTP、HTTPS、负载均衡算法。框架:SpringIoC原理、SpringAOP原理和使用、Spring常用的扩展点、MyBatis的核心

    2022年7月8日
    35
  • QListWidget常用方法

    QListWidget常用方法本文转载自:http://blog.csdn.net/xgbing/article/details/7768226 QListWidget类也是GUI中常用的类,它从QListView下派生:[cpp] viewplaincopyclass Q_GUI_EXPORT QListWidget : public QListView

    2022年5月3日
    49
  • python专业版激活成功教程_pycharm专业版和社区版的区别

    python专业版激活成功教程_pycharm专业版和社区版的区别PyCharm是一种PythonIDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。PyCharm最常用的两个版本就是社区版和专业版,这两个版本区别如下:专业版和社区版的区别除了这两版本之外,还有一个版本就是教育版,这三个有什么区别呢?1.收费不同首先就是三者的收费不同:专业版是收费的,另外两个是免费的。2.功能不同pyCharm专业版是功能最丰富的,与社区版相比,PYc…

    2022年8月25日
    12
  • GridLayout用法「建议收藏」

    GridLayout用法「建议收藏」概述  在Android中,使用的最多的布局是LinearLayout了,它可以让布局界面中的子控件以常见的方式比如水平或者垂直方向对齐。在使用LinearLayout时,开发者应该会记得,会经常遇到复杂的布局结构,所以会时常使用各种LinearLayout进行嵌套,而且应该注意嵌套层次不要过多。  有很多不错的文章(比如有:AndroidLayoutTricks#1,Flattening

    2022年6月7日
    37
  • python中bool函数_bool()函数以及Python中的示例

    python中bool函数_bool()函数以及Python中的示例python中bool函数Pythonbool()函数(Pythonbool()function)bool()functionisusedtoconvertagivenvaluetotheBooleanvalue(TrueorFalse)asperthestandardtruthtestingprocedures.Itacceptsa…

    2022年6月4日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号