每日一题gogogo

今天的每日一题来源于真实的企业场景

局部变量能否和全局变量重名?

可以重名,当两者重名的时候,会触发变量遮蔽:在局部变量的作用域内,局部变量拥有更高的优先级,全局变量会被隐蔽,直接使用该变量只会访问局部变量(就近原则)

如何引用一个已经定义过的全局变量?

~同一文件内引用

如果全局变量定义在文件的后半部分,或者为了代码结构清晰,在函数前使用该变量,需要提前通知编译器

方法:使用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)
相关推荐
金銀銅鐵18 小时前
带您看懂字节码指令(三):同一行加法,为什么有四种指令
java·jvm
jyOverQ19 小时前
从零学 JVM(五):垃圾回收机制——对象存活判断与 GC Roots
jvm
金銀銅鐵1 天前
一个 4 个常量的枚举,Kotlin 在字节码里生成了什么
jvm·kotlin
2301_808414381 天前
Linux线程的同步与互斥
jvm
曲径海盗2 天前
Try-Except怎么用,3个追问解答在自动化下的应用
java·jvm·oracle
寂寞的船5 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
金銀銅鐵7 天前
同一个 Hello World,Kotlin 和 Java 在字节码层面差在哪
jvm·后端·kotlin
yeccheng8 天前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
On The Road :10 天前
深入理解 JVM 垃圾回收:GC 是什么、如何判定垃圾、四大回收算法全解析
jvm·算法
Yves..10 天前
JVM 学习笔记:内存区域、类加载机制与垃圾回收
jvm