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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章