今天的每日一题来源于真实的企业场景
局部变量能否和全局变量重名?
可以重名,当两者重名的时候,会触发变量遮蔽:在局部变量的作用域内,局部变量拥有更高的优先级,全局变量会被隐蔽,直接使用该变量只会访问局部变量(就近原则)
如何引用一个已经定义过的全局变量?
~同一文件内引用
如果全局变量定义在文件的后半部分,或者为了代码结构清晰,在函数前使用该变量,需要提前通知编译器
方法:使用extern关键字,或者直接在使用前完成变量定义
cs
#include <stdio.h>
void print_val(void)
{
extern int g_val;
printf("g_val = %d\n",g_val);
}
int g_val = 42;
int main(void)
{
print_val();
return 0;
}
~跨文件(多源文件)引用(最常见)
在工程开发过程中,全局变量通常定义在一个源文件(.c)中,.c文件共同访问
在var.c中定义变量(分配内存)
cs
int g_shared_count = 100; //定义,分配实际内存
在var.h中用extern声明(不分配内存)
cs
#ifndef VAR_H
#define VAR_H
extern int g_shared_count; //声明,告诉外部存在此符号
#endif
在需要使用的main.c中包含头文件
cs
#include <stdio.h>
#include "var.h"
int main(void)
{
printf("共享变量:%d\n,g_shared_count);
g_shared_count+=10;
printf("修改后:%d\n",g_shared_count);
return 0;
}
全局变量可不可以以定义在可被多个.c文件包含的头文件中?为什么?
计算机底层C语言并不是"先有一个全局总管,再分配给各个文件"
他的流程是分步的
第一步:每个.c都是各做各的,互不通气,假设你的头文件写了 int a = 10;并且file1.c file2.c都包含了
file1.c 编译时,他只看到了自己眼前的文件,看到int a = 10;,申请4个字节的内存,取名叫a,分配的地址是0x1000
file2.c编译时,它也申请4个字节的内存,地址是0x2000
这样,内存里面已经实实在在被造出两个互不相关的独立变量
第二步:链接器来收工时
打包员需要把他们拼成一个app.exe
打开这两个包时,都有这个叫a的变量,但是各自建了一个不同的内存地址,直接报错罢工
如何解决:
只有一个文件负责造实体 其他的文件负责寻人启事(extern)
队列和栈有什么区别:
元素进出的顺序规则与操作端点的限制
| 核心维度 | 栈(Stack) | 队列(Queue) |
|---|---|---|
| 操作原则 | LIFO(Last In, First Out,后进先出) | FIFO(First In, First Out,先进先出) |
| 操作端点 | 仅单端操作(栈顶 Top 插入与删除) | 双端操作(队尾 Rear 入队,队头 Front 出队) |
| 形象比喻 | 往弹匣装子弹、叠盘子(最后放的最先拿) | 排队买票、管道流水(先来的先服务) |
| 常见操作 | push(入栈)、pop(出栈)、peek/top(查看栈顶) |
enqueue(入队)、dequeue(出队)、front(查看队头) |
| 典型应用 | 函数调用栈、括号匹配、浏览器"后退"、Undo/Redo | 任务调度、消息队列、打印机作业缓冲、广度优先搜索(BFS) |
| 算法对应 | 深度优先搜索(DFS)、回溯算法 | 广度优先搜索(BFS) |