每日面试题
static 关键字在 全局变量、局部变量、函数的区别?
①全局变量+static:改变作用域,改变(限制)其使用范围。
只初始化一次,防止在其他文件单元中被引用。全局变量的作用域是整个源程序,在各个源文件中都是有效的,而加了静态后的全局变量的作用域仅限于一个源文件中。
②局部变量+static:普通的局部变量是在函数或方法执行完毕后释放存储空间,而静态局部变量在程序开始执行时分配存储空间,直到程序结束才释放。这意味着即使函数或方法执行完毕,静态局部变量的值仍然会保留,并在下一次函数调用时保持其值。
③普通函数+static:作用域不同,仅在本文件。
程序的内存分配
- 栈区:由编译器进行管理,自动分配和释放,存放的是函数调用过程中的各种参数,局部变量,返回值以及函数返回地址。
- 堆区:用于程序动态申请分配和释放空间,malloc和free,程序员申请的空间在使用结束后应该释放,否则程序自动收回。
- 全局(静态)存储区:分为DATA(已经初始化),BSS(未初始化)段,DATA段存放的是全部变量和静态变量;BSS(未初始化)存放未初始化的全局变量和静态变量。程序运行结束后自动释放,其中BSS(全部未初始化区)会被系统自动清零。
- 文字常量区:存放常量字符串,程序结束后由系统释放。
- 程序代码段:存放程序的二进制代码。
每日算法
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
class Solution {
public:
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
ListNode* p = headA;
ListNode* q = headB;
int lenA = 0;
int lenB = 0;
while (p != NULL) {
lenA++;
p = p->next;
}
while (q != NULL) {
lenB++;
q = q->next;
}
p = headA;
q = headB;
if (lenA < lenB) {
swap(lenA, lenB);
swap(p, q);
}
int gap = lenA - lenB;
while (gap--) {
p=p->next;
}
while (p != NULL) {
if (p == q)
return p;
p = p->next;
q = q->next;
}
return NULL;
}
};