面试题2

109 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

C++ 的集中传值方式

C++中的传值方式一共有三种:分别是值传递、引用传递和指针传递 1.值传递:形参即使在函数体内发生改变,也不会影响实参的值 2.引用传递:形参在函数体内的值发生改变 3.指针传递:在指针指向没有发生改变的前提下,形参在函数体内值发生变化的时候,会影响实参的值

1.值传递用于对象时,整个对象会拷贝一个副本,效率很低; 2.引用传递用于对象时,不会发生拷贝行为,只绑定对象更安全、更高效; 3.指针传递与引用传递一样,但没有引用传递安全

反转链表 这道题是面试笔试里常出现的题目,想出来挺容易的,但不太好写 这里我贴出代码

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* temp;
        ListNode* pre = nullptr;
        ListNode* cur = head;
        while(cur) {
            temp = cur->next;//	存储当前节点的下一个节点
            cur->next = pre;//	这里开始反转链表
            pre = cur;//	这里是将节点交换,达成指针右移的目的
            cur = temp;
        }
        return pre;
    }
};

这里我用的方法只需要一次遍历,在遍历的同时,将指针的方向反转,达到反转链表的目的

什么是野指针

概念:野指针也就是指向位置不可知的指针 产生原因:释放内存后,指针没有及时置空,仍然指向该内存

char *p = (char *)malloc(sizeof(char)*100);  
strcpy(p, "Douya");  
free(p);//	p所指向的内存被释放,但是p所指的地址仍然不变  
...  
if (p != NULL){//	没有起到防错作用  
    strcpy(p, "hello, Douya!");//	error
}  

如何避免野指针的产生? 1.指针初始化的时候置空

char *p = NULL;

2.申请内存后,将其判断为空 3.指针释放后置空

示例代码如下:

int *p = NULL; //初始化置NULL
p = (int *)malloc(sizeof(int)*n); //申请n个int内存空间 
assert(p != NULL); //判空,防错设计

//重新分配内存, p 所指向的内存块会被释放并分配一个新的内存地址
p = (int *) realloc(p, 25);
free(p); 
p = NULL; //释放后置空