美文网首页
c语言的面试

c语言的面试

作者: 史记_d5da | 来源:发表于2020-05-24 16:00 被阅读0次

    很早以前面试了一家公司,本来我是做iOS的,结果这家公司只有做C++和android的,硬着头皮去面试C++,昨天准备了一个早上。结果人事给了我一份C语言的面试题。虽然都是一些基础的题目但是我一道题也答不上来。凭着模糊的记忆,还能记下几道题。

    1、const的做用至少说出两个

    归纳了一下大致分为以下几点
    1.限定变量为不可修改。
    2.限定成员函数不可以修改任何数据成员。
    3.const与指针:
    const char *p 表示 指向的内容不能改变。
    char * const p,就是将P声明为常指针,它的地址不能改变,是固定的,但是它的内容可以改变。

    // 修饰变量a不可变
    const int a = 7; 
    
    // 修饰指针p不可变 *p可以改变
    int a = 8;
    int* const p = &a;
    *p = 9
    
    // 修饰函数参数 a 不可变
    void func(const int a)
    {
        cout<<a; 
    }
    
    // 当 const 参数为指针时,可以防止指针被意外篡改。指针a不能被修改
    void func(int *const a)
    {
        cout<<*a<<" ";
        *a = 9;
    }
    
    // A:const 修饰内置类型的返回值,修饰与不修饰返回值作用一样。
    // B: const 修饰自定义类型的作为返回值,此时返回的值不能作为左值使用,既不能被赋值,也不能被修改。
    // C: const 修饰返回的指针或者引用,是否返回一个指向 const 的指针,取决于我们想让用户干什么。
    const int func()
    {
        return 1;
    }
    
    // const 修饰类成员函数,其目的是防止成员函数修改被调用对象的值,如果我们不想修改一个调用对象的值,所有的成员函数都应当声明为 const 成员函数。
    int func()const
    {
        return _cm;
    }
    

    2、sizeof和strlen的区别

    sizeof是操作符,参数为任意类型,主要计算类型占用内存大小。
    strlen()是函数,其参数为char*,strlen只能计算以"\0"结尾字符串的长度,计算结果不包括"\0"。

    char str[]="abced";  
    // 字符数组str包含6个元素(a,b,c,d,e,\0),每个元素占用1个字节。
    int a= sizeof(str);  
    // len为5,不包含"\0"。
    int len=strlen(str);  
    //str[0]是字符元素a,所以b=1  
    int b= sizeof(str[0]);
    

    32位系统中内置数据类型占用的字节数
    char :1个字节(固定)
    *(即指针变量): 4个字节(32位机的寻址空间是4个字节。同理64位编译器)(变化*)
    short int : 2个字节(固定)
    int: 4个字节(固定)
    unsigned int : 4个字节(固定)
    float: 4个字节(固定)
    double: 8个字节(固定)
    long: 4个字节
    unsigned long: 4个字节(变化*,其实就是寻址控件的地址长度数值)
    long long: 8个字节(固定)
    64位系统中
    *(即指针变量): 8个字节
    long: 8个字节
    unsigned long: 8个字节(变化*其实就是寻址控件的地址长度数值)
    其余都一样

    3、指针函数对a、b两个值进行交换

    int swap_pointer(int *p1, int *p2)  
    {
        int temp = *p1;
        *p1 = *p2;
        *p2 = temp;
        return 0;
    }
    
    int main() 
    {
        int a = 3, b = 5;
        swap_pointer(&a, &b);
        printf("a = %d ,b = %d\n",a, b);  //交换成功
        return 0;
    }
    

    4、双向链表删除一个节点

    typedef struct Node
    {
        int element;
        struct Node *prior;
        struct Node *next;
    }node;
    
    // 生成100的双向链表
    Node *create() {
        node *head, *p;
        head = (node *)malloc(sizeof(node));
        head->element = 99; // 结束标识
        p = head;
        for (int i = 0; i < 100; i++) {
            p->next = (node *)malloc(sizeof(node));
            p->next->prior = p;
            p = p->next;
            p->element = i;
        }
        p->next = head;
        head->prior = p;
        return head;
    }
    // 删除指定的元素
    int delete(Node *head, int a) {
        node *p;
        p = head->next;
        while(p->element != a) {
            p = p->next;
        }
        if (p->element == a) {
            p->prior->next = p->next;
            p->next->prior = p->prior;
            return 1;
        } else {
            return 0;
        }
    }
    // 删除50的元素
    int main() {
        node *head = create();
        delete(head, 50);
    }
    

    相关文章

      网友评论

          本文标题:c语言的面试

          本文链接:https://www.haomeiwen.com/subject/tvddahtx.html