C语言变量的声明和定义有什么区别?

定义:

  • 定义:为变量分配地址和存储空间
  • 声明:不分配地址和存储空间

一个变量可以在多个地方声明,但是只在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件或在文件后面部分定义。

1.变量声明

  • 作用:告诉编译器"这个变量存在",并且说明它的类型和名字,但不分配存储空间(特殊情况除外)。
  • 特征:

1.不创建内存,只是一个"公告"

2.常见于extern关键字修饰的变量

3.典型使用场景:在头文件 .h 中声明,让其他 .c 文件知道有这个变量。

  • 示例:
cs 复制代码
extern int a; // 声明,告诉编译器 a 在别的地方定义过

2.变量定义

  • 作用:真正创建变量,并分配内存空间,可以(也可以不)赋初值。

  • 特征:

1.编译器会为它分配存储空间

2.一个变量在整个程序中只能被定义一次(全局变量)。

3.没有extern,且位于函数体外部时,一般就是定义。

  • 示例:
cs 复制代码
int a = 10; // 定义,分配空间,并赋初值 10

3.容易混淆的点

  • 没有 extern 的全局变量声明就是定义:
cs 复制代码
int b; // 在全局范围,这是定义(分配空间,默认初始化为0)
  • 局部变量声明就是定义(因为它会分配在栈上):
cs 复制代码
void func() {
    int c; // 局部变量,声明同时定义
}
  • 只有声明,没有定义的变量,必须在其他文件中有定义,否则链接时报错。

4.总结对比表

对比项 声明(Declaration) 定义(Definition)
是否分配内存 否(除非是局部变量) 是
是否初始化 否 可以初始化
是否唯一 可以多次声明 在全局范围只能有一次定义
常见关键字 extern 无 extern,或带初始化
场景 告诉编译器变量存在 真正创建变量并分配空间

5.快速记忆

声明是告诉编译器"它有",定义是告诉编译器"它在这里"并给它空间。

相关推荐
是main不是漫3 分钟前
【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基
c语言·开发语言·c++
apcipot_rain4 小时前
C++转Java日记(06)
java·开发语言
SomeOtherTime11 小时前
Rust所有权(AI回答)
开发语言·后端·rust
Easyhood11 小时前
Android 开发入门实践(十四):Compose 副作用入门与四个常用 API
android·开发语言·kotlin·android jetpack·compose
白杨尚青12 小时前
C++进阶篇(六):map 和 set 的模拟实现——用红黑树封装 mymap/myset(迭代器 + operator[])
开发语言·c++·迭代器·stl·set·map·红黑树
饮水桶_T15 小时前
JAVA IO流笔记
开发语言·数据结构·算法
Felven18 小时前
C. Brr Brrr Patapim
c语言·开发语言
路溪非溪19 小时前
python标准库使用总结
开发语言·python
Zwawa20 小时前
嵌入式OLED表驱动菜单:用一张表、一个栈和一个窗口重写表驱动菜单
c语言·单片机·嵌入式
SomeOtherTime21 小时前
Rust 面向对象介绍(AI回答)
开发语言·python·rust