C語言變量的聲明和定義有什么區別?

定義:

  • 定義:為變量分配地址和存儲空間
  • 聲明:不分配地址和存儲空間

一個變量可以在多個地方聲明,但是只在一個地方定義。加入extern修飾的是變量的聲明,說明此變量將在文件或在文件后面部分定義。

1.變量聲明

  • 作用:告訴編譯器“這個變量存在”,并且說明它的類型和名字,但不分配存儲空間(特殊情況除外)。
  • 特征:

? ? ? ? ? ? ?1.不創建內存,只是一個“公告”?

? ? ? ? ? ? ?2.常見于extern關鍵字修飾的變量

? ? ? ? ? ? ?3.典型使用場景:在頭文件 .h 中聲明,讓其他 .c 文件知道有這個變量。

  • 示例:
extern int a; // 聲明,告訴編譯器 a 在別的地方定義過

2.變量定義

  • 作用:真正創建變量,并分配內存空間,可以(也可以不)賦初值。

  • 特征

? ? ? ? ? ? ? 1.編譯器會為它分配存儲空間

? ? ? ? ? ? ? 2.一個變量在整個程序中只能被定義一次(全局變量)。

? ? ? ? ? ? ? 3.沒有extern,且位于函數體外部時,一般就是定義。

  • 示例:
int a = 10; // 定義,分配空間,并賦初值 10

3.容易混淆的點

  • 沒有 extern 的全局變量聲明就是定義:
int b; // 在全局范圍,這是定義(分配空間,默認初始化為0)
  • 局部變量聲明就是定義(因為它會分配在棧上):
void func() {int c; // 局部變量,聲明同時定義
}
  • 只有聲明,沒有定義的變量,必須在其他文件中有定義,否則鏈接時報錯

4.總結對比表

對比項聲明(Declaration)定義(Definition)
是否分配內存否(除非是局部變量)
是否初始化可以初始化
是否唯一可以多次聲明在全局范圍只能有一次定義
常見關鍵字externextern,或帶初始化
場景告訴編譯器變量存在真正創建變量并分配空間

5.快速記憶

聲明是告訴編譯器“它有”,定義是告訴編譯器“它在這里”并給它空間。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918474.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918474.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918474.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

imx6ull-驅動開發篇20——linux互斥體實驗

目錄 實驗程序編寫 修改設備樹文件 LED 驅動修改 mutex.c 測試mutexApp.c Makefile 文件 運行測試 在之前的文章里,我們學習了:驅動開發篇16——信號量與互斥體。 本講實驗里,我們來使用互斥體mutex實現 LED 燈互斥訪問的功能&#x…

[4.2-2] NCCL新版本的register如何實現的?

文章目錄1->2->31. ncclRegisterP2pIpcBuffer2. ncclIpcLocalRegisterBuffer(..., 1, 0,...)3. ipcRegisterBuffer(..., regRecord,..., isLegacyIpc)4. p2pProxyRegister()1->2->3 1. ncclRegisterP2pIpcBuffer 在enqueue.cc內的調用是: NCCLCHECK(…

在idea中git切換分支,但是我的文件沒add,沒commit

這是一個很悲傷的故事,我朋友一個下午寫了4個小時的代碼,差不多10多個類,都在切換分支的時候。IDEA發現有沖突,然后就要resolve conflict,發現自己不知道怎么操作,就點了abort & rollback。然后所有代碼…

GPFS api

一、核心命令行 API(mm 命令集) GPFS 最基礎且常用的接口是命令行工具集(以mm為前綴),用于文件系統的創建、配置、管理和監控。這些命令可直接在終端執行,也可通過腳本(如 Shell、Python&#…

虛擬機一站式部署Claude Code 可視化UI界面

前言 最近,強大的 AI 編碼助手 Claude Code 在開發者社區中迅速走紅,憑借其出色的代碼生成和理解能力贏得了廣泛贊譽。然而,其純粹基于命令行的交互方式,對于許多習慣了圖形化界面的開發者,尤其是新手而言&#xff0c…

網站IP被劫持?三步自建防護盾

一、劫持檢測實戰(Python腳本) import requests import socket import ssldef check_hijacking(domain):try:# 獲取真實DNS解析real_ip socket.gethostbyname(domain)# 本地發起請求驗證response requests.get(f"https://{domain}", timeout…

SQL Server從入門到項目實踐(超值版)讀書筆記 23

第三篇 核心應用篇在本章中,將通過案例示范學習SQL Server數據庫的一些核心應用。例如,SQL Server視圖的使用、游標的應用、存儲過程的應用、索引的應用、觸發器的應用、SQL Server事務與鎖的應用等。學完本篇,讀者將對SQL Server數據庫的管理…

功能測試中常見的面試題-一

一、基礎概念與理論題什么是軟件測試?它的目的是什么?回答: 軟件測試是通過人工或自動化手段,運行或評估軟件系統,以驗證它是否滿足規定的需求、識別實際結果與預期結果之間的差異,并評估軟件產品質量的過程…

LINUX88 變量:命令定義;普通數組定義(復);declare -i /-x

問題 [codesamba ~]$ array3(ls axel-2.4) [codesamba ~]$ echo $array3 API [codesamba ~]$ ls axel-2.4 API CHANGES conn.o gui README tcp.o axel conf.c COPYING http.c ru.mo text.c axel.1 …

數字IC后端PPA優化| Timing一致性調整方法和Module Region規劃方法

Q1:直播課經常講到一致性,這個一致性的話一般是指place,CTS和PT的derating time,uncertainty和transition嗎,我大概知道innovus的uncertainty設置要比PT里面高一點,但具體設計時這幾部分的大小應該是一個什么樣的關系或…

電子電氣架構 --- 軟件定義汽車的驅動和挑戰

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

機器學習——10 支持向量機SVM

1 支持向量機 1.1 故事引入看下圖左邊,藍色和紅色的點混在一起,這就像一堆數據,沒辦法用一條簡單的直線把它們分開。再看下圖右邊,有一條直線把藍色和紅色的點分開,這就是SVM在找的“決策邊界”,它能把不同…

若以微服務部署踩坑點

windows docker desktop 部署nacos mysql1、docker部署nacosdocker pull nacos/nacos-server:v2.4.3docker啟動命令 docker run --name nacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 --privilegedtrue --network bridge -e MODEstandalone -e SPRING_DATASOURCE_PLATFORMm…

Lua基礎+Lua數據類型

Lua基礎 Lua介紹 特點:輕量、小巧。C語言開發。開源。 設計的目的:嵌入到應用程序當中,提供靈活的擴展和定制化的功能。 luanginx,luaredis。 環境安裝 windows上安裝lua: 檢查機器上是否有lua C:\Users\cpf>lua lu…

基于VuePress2開發文檔自部署及嵌入VUE項目

最近在搞前端開發幫助文檔,轉了一圈發現Vue提供了一個高性能的、Vue驅動的靜態網站生成框架-VuePress。VuePress 是一個以 Markdown 為中心的靜態網站生成器。你可以使用 Markdown 來書寫內容(如文檔、博客等),然后 VuePress 會生…

Flask初步學習

文章目錄一、初識Flask1.1 Pycharm修改環境配置1.2 運行第一個flask項目1.3 獲取數據請求1.3.1 動態路由參數一、初識Flask 1.1 Pycharm修改環境配置 file——settings——project——python Interpreter——add interpreter——add local interpreter 1.2 運行第一個fla…

word的正則替換

word查看選中了幾行 word替換掉空行 替換空行 按下 “Ctrl H” 組合鍵打開 “查找和替換” 對話框,在 “查找內容” 框中輸入 “pp”,“^p” 代表段落標記,兩個 “^p” 表示連續的兩個段落標記,即空行。在 “替換為” 框中輸入 “…

Spring Framework源碼解析——DisposableBean

版權聲明 本文原創作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl一、概述 DisposableBean 是 Spring 框架中用于定義 Bean 銷毀時回調行為的核心接口之一。它提供了一個標準化的鉤子方法 destroy(),允許 Bean 在容器關閉或作用域…

linux安裝和使用git

Linux 上安裝 Git 在 Linux 上安裝 Git,你可以按照以下步驟進行: 打開終端:打開你的 Linux 終端應用程序。通常可以通過在應用程序菜單中搜索 "Terminal" 或 "終端" 來找到它。 更新軟件包列表:運行以下命令…

數字圖像處理4

預處理——ROI——形態學處理形態學處理形態學變化只能在二值圖上處理1.腐蝕Erode對kernel映射的區域做與操作,包括自己在內如果有0則中間賦值成02.膨脹Dilate對kernel映射的區域做或操作,包括自己在內如果有1則中間賦值成13.其他操作開操作:…