zoukankan      html  css  js  c++  java
  • C语言面试题

    #include <stdio.h>
    
    int main()
    {
        int a[5] = {1, 2, 3, 4, 5};
        int* p1 = (int*)(&a + 1); // <==> (unsigned int)&a+sizeof(*&a) => 整个数组后面的那个地址
        int* p2 = (int*)((int)a + 1); <=> 取a[0]后三个字节拼接a[1]第一个字节 => 0x02000000
        int* p3 = (int*)(a + 1); <=> a[2]
        
        printf("%d
    ", p1[-1]); // (unsigned int)p1-1*sizeof(*p1) => a[4]
        printf("%d
    ", p2[0]);  //  0x02000000
        printf("%d
    ", p3[1]); // a[3]
        
        return 0;
    }

    一条语句实现strlen

    return (assert(s), (*s ? strlen(s+1)+1 : 0));
    #size_t为无符号整数 strlen的返回值为 size_t 类型
    size_t strlen(const char* s)
    {
        size_t length = 0;
        aasert(s);//当指针为空时运行出错 assert.h 
        
        while(*s++)
        {
            length++;
        }
        return 
        
    }

    strcpy实现

    #include <stdio.h>
    #include <assert.h>
    
    char* strcpy(char* dst, const char* src)
    {
        char* ret = dst;
        
        assert(dst && src);
        
        while( (*dst++ = *src++) != '' );
        
        return ret;
    }
    
    int main()
    {
        char dst[20];
        
        printf("%s
    ", strcpy(dst, "Delphi Tang!"));
        
        return 0;
    }

    重置动态空间的大小:

    #include <stdio.h>
    #include <malloc.h>
    
    int reset(char**p, int size, int new_size)
    {
        int ret = 1;
        int i = 0;
        int len = 0;
        char* pt = NULL;
        char* tmp = NULL;
        char* pp = *p;
        
        if( (p != NULL) && (new_size > 0) )
        {
            pt = (char*)malloc(new_size);
            
            tmp = pt;
            
            len = (size < new_size) ? size : new_size;
            
            for(i=0; i<len; i++)
            {
                *tmp++ = *pp++;      
            }
            
            free(*p);
            *p = pt;
        }
        else
        {
            ret = 0;
        }
        
        return ret;
    }
    
    int main()
    {
        char* p = (char*)malloc(5);
        
        printf("%0X
    ", p);
        
        if( reset(&p, 5, 3) )
        {
            printf("%0X
    ", p);
        }
        
        return 0;
    }

    一维方式打印二维数组:

    #include <stdio.h>
    #include <malloc.h>
    
    void printArray(int a[], int size)
    {
        int i = 0;
        
        printf("printArray: %d
    ", sizeof(a));
    
        for(i=0; i<size; i++)
        {
            printf("%d
    ", a[i]);
        }
    }
    
    int main()
    {
        int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
        int* p = &a[0][0];
        
        printArray(p, 9);
        
        return 0;
    }

    指针方式打印二维数组:

    #include <stdio.h>
    
    int main(int argc, char* argv[], char* env[])
    {
        int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
        int i = 0;
        int j = 0;
        
        for(i=0; i<3; i++)
        {
            for(j=0; j<3; j++)
            {
                printf("%d
    ", *(*(a+i) + j));
            }
        }
    }
    #include <stdio.h>
    
    int main()
    {
        int a[5][5];
        int(*p)[4];
        
        p = a;
        
        printf("%d
    ", &p[4][2] - &a[4][2]); // -4
    }

    指针阅读技巧:
    右左法则
    1、从最里层的(最左)圆括号中未定义的标识符看起
    2、先往右看,再往左看
    3、当遇到圆括号或者(方括号时可以确定部分类型),并调转方向
    4、重复 2,3 知道结束

    #include <stdio.h>
    
    int main()
    { 
        int (*p2)(int*, int (*f)(int*));
        
        int (*p3[5])(int*);
        
        int (*(*p4)[5])(int*);
        
        int (*(*p5)(int*))[5];
    }

    返回 int(*)[5] 数组指针类型

    #include "stdio.h"
    int test(int i)
    {
            return i;
    }
    
    int (*test(int *p))[5]  //返回类型为 int(*)[5]
    {
            static int a[5]={1,2,3,4,5};    
            return &a;
    }
    
    int main(int argc, char** argv, char*  env[])  
    {
    
            int (*(*p5)(int*))[5];
            int a = 1;
            //p5 = &a;
            p5 = test; 
    
            int(*p)[5] = p5(&a); 
    
            printf("%d 
    ", *(*p+1));
            printf("%d 
    ", *(*p+2));
    
            return 0;
    }

    动态申请二维数组(没用一维数组指针实现,而是用的普通的int *指针)

    int **malloc2d(int row, int col)
    {
        int** ret = (int**)malloc(sizeof(int*)*row);
        int* p = (int*)malloc(sizeof(int)*row*col);
    
        int i = 0;
        if (ret && p)
        {
            for (i = 0; i < row;i++)
            {
                ret[i] = (p + i*col);
            }
        }
        else{
            free(p);
            free(ret);
        }
    
        return ret;
    }
    
    void free2d(int **a)
    {
        free(a[0]);
        free(a);
    }

    二维数组做参数

    #include <stdio.h>
    
    void access(int a[][3], int row) 
    {
        //没必要传递列,可以计算出来,c语言中只有一维数组
    
        int col = sizeof(*a) / sizeof(int);
        int i = 0;
        int j = 0;
        
        printf("sizeof(a) = %d
    ", sizeof(a));
        
        for(i=0; i<row; i++)
        {
            for(j=0; j<col; j++)
            {
                printf("%d
    ", a[i][j]);
            }
        }
    }
    
    int main()
    {
        int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
        
        access(a, 3);
    }

    求n个数的平均值

    #include <stdio.h>
    #include <stdarg.h>
    
    float average(int n, ...)
    {
        va_list args;
        int i = 0;
        float sum = 0;
        
        va_start(args, n);
        
        for(i=0; i<n; i++)
        {
            sum += va_arg(args, int);
        }
        
        va_end(args);
        
        return sum / n;
    }
    
    int main()
    {
        printf("%f
    ", average(5, 1, 2, 3, 4, 5));
        printf("%f
    ", average(4, 1, 2, 3, 4));
        
        return 0;
    }

    按字节进行清零

    #include <stdio.h>
    
    #define RESET(p, len) while( len > 0) ((char*)p)[--len] = 0
    
    void reset(void* p, int len)
    {
        while( len > 0 ) 
        {
            ((char*)p)[--len] = 0;
        }
    }
    
    int main()
    {
        int array[] = {1, 2, 3, 4, 5};
        int len = sizeof(array);
        
        reset(array, len);
        RESET(array, len);
        
        return 0;
    }
  • 相关阅读:
    java文件下载
    java中StringUtils中isEmpty 和isBlank的区别
    spring boot jsp页面
    hello,word!
    maven compile启动报错
    java File类常用方法
    spring boot 启动问题
    /proc/sys/net/ipv4/下各项的意义
    Zend Framework 中 htaccess 的标准配置
    三种识别目标为移动设备的方法
  • 原文地址:https://www.cnblogs.com/siqi/p/4695739.html
Copyright © 2011-2022 走看看