【C/C++面试必备】声明和定义的区别

本文来介绍一下声明和定义的区别,本文中的程序以 C/C++ 为例进行说明。

一、变量的声明和定义

1.1 声明

声明是用来告诉编译器变量的名称和类型,而不分配内存。

例如:

extern int var; // 声明extern int ble =10; // 定义typedef int INT; // 声明struct Node; // 声明

上面代码中,语句 extern int var;表示 var 在别的文件中已经定义,提示编译器遇到此变量时在其它模块中寻找其定义。语句 extern int ble = 10;表示定义了变量 ble,这一点需要注意。

注意:即使是 extern ,如果给变量赋值了,就是定义了。

1.2 定义

定义是为了给变量分配内存,可以为变量赋初值。

注意:全局变量或静态变量初始值为0,局部变量初始化为随机值。

在 C/C++ 中,变量的声明和定义区别并不大,定义和声明往往是同时发生,变量定义时,会根据变量类型分配空间,如下所示:

int value ; //声明 + 定义struct Node { // 声明 + 定义int left;int right;
}; 

上面代码中,变量名为 value,类型为 int ,分配 4 字节的内存(不同编译器会有差异)。

1.3 区分定义和声明

通常变量的定义和声明是同时发生的,注意:extern 变量类型 变量名 仅是声明。

二、函数的声明和定义

2.1 函数声明

函数的声明是通知编译器函数名称、参数数量和类型以及函数返回类型,例如:

int Max(int x, int y);

在上面的代码中,函数名为 Max,返回类型为 int 、参数为 int x,int y

2.2 函数定义

函数的定义是为函数分配内存,例如:

int Max(int x, int y) {return x > y ? x : y;}

函数定义包含了函数的具体实现。 

2.3 函数声明和定义区分

函数只要有实现(存在函数体 { …… } )即为定义,否则为声明。可以这样理解:函数声明是说明函数是什么,函数定义是说明函数做什么。

三、声明和定义的区别

3.1 声明/定义次数

变量/函数可以声明多次,变量/函数的定义只能一次。

3.2 分配内存

声明不会分配内存,定义会分配内存。

3.3 做了什么

声明是告诉编译器变量或函数的类型和名称等,定义是告诉编译器变量的值,函数具体干什么。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/802528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024HW --->反序列化漏洞!

对于反序列化,这个漏洞也是常用的,不过涉及到的方面非常非常广,比其他漏洞也难很多 于是本篇文章就分成PHP和JAVA的反序列化来讲讲 1.反序列化 想要理解反序列化,首先就要理解序列化 序列化:把对象转换为字节序列的过…

默克尔(Merkle)树 - 原理及用途

默克尔(Merkle)树的原理以及用途 引言 在当今数字化时代,确保数据的完整性是至关重要的。默克尔树作为一种高效的数据结构,被广泛应用于网络安全、分布式系统以及加密货币等领域,用于验证大量数据的完整性和一致性 数…

【HTB】 OpenSource

OpenSource 靶机地址:https://app.hackthebox.com/machines/471 信息收集 ┌──(root㉿kali)-[~/Desktop] └─# nmap -Pn -sC -sV -p- 10.129.212.208 --min-rate5000 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-08 16:01 CST Nmap scan report f…

GPIO口工作原理的超详细解释

一、GPIO基本结构 每个GPIO内部都有这样的一个电路结构,这个结构在本文下面会具体介绍。 这边的电路图稍微提一下: 保护二极管: IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。当引脚电压高于VDD时,上方的二…

Altair® (澳汰尔)Inspire™ Print3D 打造高效的增材制造设计

Altair (澳汰尔)Inspire™ Print3D 打造高效的增材制造设计 借助 Inspire Print3D,可加速创新、结构高效的 3D 打印部件的创建、优化和研究,提供快速准确的工具集,可用于实现选择性激光熔融 (SLM) 部件的设计和过程仿…

Bilstm双向长短期神经网络多输入单输出回归分析

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 基于双向长短期神经网络的多输入单输出回归分析,基于bilstm的多输入单输出回归分析 完整代码:Bilstm双向长短期神经网络多输入单输出回归分析.zip资源-CSDN文库 https://download.csdn.net/download/abc9918351…

基于SSM+Jsp+Mysql的快递管理系统

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

背包问题四种类型

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、01背包二、完全背包1.引入库 三.多重背包优化: 四.分组背包总结 前言 提示:这里可以添加本文要记录的大概内容: 例如&…

第十三章 OpenGL ES-RGB、HSV、HSL模型介绍

第十三章 OpenGL ES-RGB、HSV、HSL模型详细介绍 第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标 第二章 OpenGL ES 基础-GLSL语法简单总结 第三章 OpenGL ES 基础-GLSL渲染纹理 第四章 OpenGL ES 基础-位移、缩放、旋转原理 第五章 OpenGL ES 基础-透视投影矩阵与正交投影矩阵…

ubuntu23 安装nodejs

在 Ubuntu 23 上安装 Node.js,您可以遵循以下步骤: 步骤 1: 更新系统软件包 首先,确保您的 Ubuntu 系统软件包列表是最新的。打开终端(Terminal)并运行: sudo apt update输入您的用户密码(输…

模拟memcpy和memmove

memcpy是内存复制函数,原型如下 void *memmove(void *dest, const void *src, size_t count) 从src地址复制count个字节到dest 模拟实现 void *memcpy(void *dest, const void *src, size_t count) {if (dest NULL || src NULL)return NULL;void *ans dest;f…

HackTheBox-Machines--CozyHosting

文章目录 1 端口扫描2 测试思路3 访问web站点4 横向移动5 权限提升 CozyHosting 测试过程 1 端口扫描 nmap -sC -sV 10.129.229.882 测试思路 目标开启了80和22端口,所以出发点从80端口开始。 1.通过在web网站寻找漏洞,获取到用户名和密码,远…

用GCC把C语言文件编译成Intel语法的汇编代码

2024年4月9日,周二下午 GCC默认把C语言文件编译成AT&T语法的汇编代码, GCC 提供了 -masmintel 选项来生成 Intel 风格的汇编代码, 通过如下命令可以编译成Intel语法: gcc -S -masmintel -o output.s input.c在这个命令中&a…

CSS层叠样式表学习(基础选择器)

(大家好,今天我们将继续来学习CSS(2)的相关知识,大家可以在评论区进行互动答疑哦~加油!💕) 目录 二、CSS基础选择器 2.1 CSS选择器的作用 2.2 选择器分类 2.3 标签选择器 2.…

Swift 异步序列 AsyncStream 新“玩法”以及内存泄漏、死循环那些事儿(上)

概览 异步序列(Async Sequence)是 Swift 5.5 新并发模型中的一员“悍将”,系统标准库中很多类都做了重构以支持异步序列。我们还可以用 AsyncStream 辅助结构非常方便的创建自己的异步序列。 这里我们就来一起聊聊 AsyncStream 结构&#xf…

写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果.(两个整数由键盘输入)

#include <stdio.h> /* * 主函数&#xff1a;计算并打印两个数的最大公约数和最小公倍数 */ int main(){ // 定义计算最大公约数和最小公倍数的函数 int hcf(int,int); int lcd(int,int,int); int u,v,h,l; // u,v为输入的两个数&#xff0c;h为最大公…

基于OTA技术的工作总结

一、引言 随着互联网的飞速发展和智能化设备的普及&#xff0c;OTA&#xff08;Over-the-Air&#xff09;技术逐渐成为了软件更新、远程配置及故障诊断的核心手段。在过去的一段时间里&#xff0c;我负责了基于OTA技术的相关工作&#xff0c;现将这段时间的工作进行总结&#…

win10下使用qemu安装aarch64架构的iso镜像虚拟机

1、win下安装qemu 最新版 可在如下链接进行下载安装 QEMU for Windows – Installers (64 bit) 2、准备aarch64的iso镜像 我这里使用的是 Kylin-Server-10-SP2-aarch64-Release-Build09-20210524.iso 3、使用如下命令启动虚拟机安装 打开powershell cd C:\Program Files\…

B02、关于垃圾回收器-6.2

1、关于 GC 的分类 1.1、串行 VS 并行 按线程数分&#xff0c;可以分为串行垃圾回收器和并行垃圾回收器。 串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作&#xff0c;此时工作线程被暂停&#xff0c;直至垃圾收集工作结束。 在诸如单CPU处理器或者较小的应…

【Leetcode】2009. 使数组连续的最少操作数

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个整数数组 n u m s nums nums 。每一次操作中&#xff0c;你可以将 n u m s nums nums 中 任意 一个元素替换成 任意 整数。 如果 n u m s nums nums 满足以下条件&…