C语言面试题每天10道题 ___3

1:指针加法 加1 是加单元1 单元的大小就是看指针指向数据类型的大小
这里写图片描述

2;数组名 首元素的地址 则为指向首元素的指针 则单元大小为 首元素大小
&数组名 数组名的地址 则表示整个数组的首地址 则单元大小为整个数组大小
这里写图片描述

3;宏定义与自加自减不能混为一谈
这里写图片描述

4;数据类型范围问题造成的死循环

unsigned char 无符号字符类型范围 0~255
char 有符号字符型 表示范围为-128~127

这里写图片描述

5:一语句实现x是否为2 的若干次幂的判断。
先是要知道 2的好多次幂 联系到 左移好多位 就是乘以2的多少次幂
左移那么就意味着补的都是0;
若 i i-1进行& 是不是就可以知道了
-1那么就意味着后面所有的0都要变成1 知道遇到1 才停止借位;

假设 2的5次幂 = 2 的一次幂 * 2的5次幂 = 10 <<5 结果就是1000000;
减1 0111111;
进行& = 0 则表示为2的n次幂
2的n次幂也可以这样解释
printf(“%c”,(a)&(a-1)?’n’:’y’);

6;在嵌入式c中怎样去获取一个全1的数
答案是0进行取反 ~0即可
而不能用FFFF因为你不知道要用多少个F去填补 因为你不知道是多少位的硬件

评价下面的代码片断:
unsigned int zero = 0;
unsigned int compzero = ?0xFFFF;
/1‘s complement of zero /
【参考答案】对于一个int型不是16位的处理器为说,上面的代码是不正
确的。应编写如下:
unsigned int compzero = ~0

引入一个问题 怎样得到一个限定个数的1; 例如32位 我需要7个1 怎么得到
答案依旧是0取反 然后加上移位 移位就意味着用0来补充
(~0)>>(32-(32-7))
要引入(32-(32-7))个0;
在位运算中有时还需要中间7个1 其余全0的情况
那就是将上面得到的1 进行移位 移到中间去 ;
在位运算中有时还需要中间7个0 其余全1的情况
那就是将上面移位完的1 进行取反 那么就是中间为0 一位1;

7;编写strcpy 函数
char *strcpy(char *strDest,const char *strSrc);
注意是const类型 所以不能进行赋值再操作那种 可以直接进行对strSrc进行操作

#include <stdio.h>
#include <stdlib.h>

char *strcpy(char *strDest,const char *strSrc);
int main()
{
    char str[20] = "linux love";
    char des[30];
    strcpy(des, str);
    printf("%s\n",des);
}
char *strcpy(char *strDest,const char *strSrc)
{
    char *pd = NULL;
    pd = strDest; 
    while(*strSrc)
    {
        *pd++ = *strSrc++;
    }
    *pd = 0;注意一下 while 结束的标志是遇到结束符0  那么结束符还没有被复制进去
    return strDest;
}

8:二分查找

#include <stdio.h>
int binary_search(int* arr, int key, int n); 
int main()
{
    int a[10] = {1,2,3,4,5,6,7,8,10};
    binary_search(a, 5, 10);

    return 0;
}
int binary_search(int* arr, int key, int n)
{
    int high = n-1, low = 0, mid, p = -1;
    mid = (high+low)/2;
    while(low <= high)
    {
        if(arr[mid] > key)
        {
            high = mid-1;
        }
        else if(arr[mid] < key)
        {
            low = mid +1;
        }
        else
        {
            p =mid;
            printf("%d %d\n",mid, arr[mid]);
            break;
        }
        mid = (low+high)/2;

    }
    return p;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值