代码改变世界

面试题

2019-02-20 14:52  好大一个苹果  阅读(197)  评论(0编辑  收藏  举报
/*
   1. a 和 &a 有什么区别请写出以下代码的打印结果
#include<stdio.h>   
void main( void )   
{   
int a[5]={1,2,3,4,5};  
int *ptr=(int *)(&a+1);  
printf("%d,%d",*(a+1),*(ptr-1));   
return;  
}

2. sizeof和strlen的区别

3. 写一个“标准”宏MIN

4. 编码实现直接插入排序

5. 野指针是如何产生的,如何避免
 */
/*
   1.a是数组的首元素的地址,&a是整个数组的地址
 *(a+1) 是 2, *(ptr-1)是 5
 */
/*
   2. sizeof是一个运算符,算的是给定对象的字节大小
   strlen是一个函数,算的是字符串的长度,参数必须是字符串的首地址
 */
/*
   3. #define  MIN(x,y)  x < y ? x : y 
 */
/*
   4.
 */
#include <stdio.h>

void sort(int *arr, int n); 
int main(void)
{
    int arr[10] = {2 , 6 ,99, 65, 87, 3, 21,55, 21,1};
    sort(arr, 10);
    for(int i=0; i<10; i++) {
        printf("%d ",arr[i]);
    }


    return 0;
}

void sort(int *arr, int n) 
{
    int i, j;
    int t;
     for(i=1; i < n; i++) {
        t = arr[i];
        for (j = i-1; j >= 0; j--) {
            if (t > arr[j]) {
                arr[j+1] = arr[j];
            } else {
                break;
            }
        }
        arr[j+1] = t;
    }
    
}
/*
   6.野指针的产生:
                     1. 指针变量没有初始化;
                  2. 指针释放后没有赋值为NULL;
     如何避免: 1. 在定义指针的时候 赋值为NULL;
                2. 使用完指针后及时的使用free ,释放内存
*//*
       6. #include 的顺序以及尖叫括号和双引号的区别

       7. 为什么要使用字节对齐?字节对齐的原则

       8. 内联函数有什么优点?内联函数和宏定义的区别

       9. 定义一个函数,把一个字符串倒序,如“abcd”倒序后变为“dcba”

       10. 某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
   */

/*
   6. 
      尖角括号里的.h文件名存放在默认文件夹下;
         双引号里的.h文件名存放在指定文件夹下
 */
/*
   7. 为了方便cpu访问,牺牲空间,提升效率
        原则: 成员依次对齐,整体是最大成员的整数倍
 */
/*
   8. 可以加快程序的运行速度,因为不需要中断调用,在编译的时候内联函数可以直接镶嵌到目标代码中。而宏只是简单的字符替换。
   区别:宏定义是在预处理阶段替换相应的代码,而内联函数是函数,不会替换
   */
/*
   9.
   
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *daoxu(char *p);
int main(void)
{
    char *p = NULL;
    size_t n =0;
    getline(&p, &n, stdin);
    printf("%s\n",daoxu(p));
    return 0;
}

char *daoxu(char *p)
{
    int i;
    int lenth = strlen(p)-1;
    char *arr = NULL;
    arr = malloc(lenth*sizeof(char));
    for(i=0; i<lenth; i++) {
        arr[i] = p[lenth - i-1];
    }
    return arr;

}*/
/*10.
*/

#include <stdio.h>

int tel(int num);
int main(void)
{
    int num;
    scanf("%d",&num);
    printf("%d\n",tel(num));
    return 0;
}

int tel(int num)
{
    int a,b,c,d;
    a = (num / 1000 + 5) % 10;
    b = (num / 100 % 10 + 5) % 10;
    c = (num / 10 % 10 + 5) % 10;
    d = (num % 10 + 5) % 10;
    return d * 1000 + c * 100 + b * 10 + a ;
}