C/C++基礎知識點

隨著工作中瑣事越來越多,靜下來好好敲代碼的時間越來越少,基礎知識雖然簡單,但常看常新,并記錄下來共勉。

一、基礎知識點

1. 內存區域中數據管理

在C和C++中,內存分為多個區域,每個區域負責存儲不同類型的數據。以下是對不同存儲區域的簡要說明:

(1)靜態區域(Static Memory)

  • 存儲內容:靜態區域用于存儲程序的全局變量、靜態變量和常量(const修飾的變量)。這些變量的生命周期從程序開始到程序結束。
  • 存儲位置:靜態變量和常量存儲在靜態數據區,通常包括:
    • 全局變量:存儲在靜態數據區中,程序運行時一直存在。
    • 靜態局部變量:通過static關鍵字聲明的局部變量,存儲在靜態數據區,不會在函數調用結束時銷毀。
    • 常量:如果常量是全局常量或者在程序中明確作為常量定義,它通常也存儲在靜態數據區。

(2) 堆(Heap)

  • 存儲內容:堆是程序運行時動態分配內存的區域。它主要用于存儲通過mallocnew等動態內存分配函數分配的內存。堆中的內存需要手動釋放(如通過freedelete)。
  • 存儲位置:堆中的內存位置是動態的,且程序可以在運行時隨時進行分配和釋放。因此,它適合存儲大小不固定或者需要在運行時決定存儲空間的數據結構(如鏈表、樹等)。

(3) 棧(Stack)

  • 存儲內容:棧主要用于存儲函數的局部變量、函數的返回地址以及函數的調用信息(如函數調用時保存的寄存器等)。當函數被調用時,棧會為該函數分配空間,函數返回時,棧空間會被自動釋放。
  • 存儲位置:棧上的變量具有“自動存儲持續性”,即它們的生命周期僅限于函數的調用周期。棧存儲的變量通常是臨時的、局部的變量。棧的內存分配和釋放由編譯器自動管理,不需要手動干預。

總結:

  • 靜態區域:全局變量、靜態變量、常量。
  • :動態分配的內存(通過mallocnew等)。
  • :函數局部變量、函數調用信息。

每個區域的存儲方式和管理方式有所不同,棧和堆是由程序運行時進行管理的,而靜態區域則在程序啟動時分配并在程序退出時釋放。

2. 全局變量、靜態變量、常量的區別

在C和C++中,全局變量、靜態變量和常量有著不同的特性和用途。以下是它們的主要區別:

(1) 全局變量(Global Variables)

  • 定義:全局變量是在所有函數外部定義的變量,通常定義在源文件的最外層。
  • 生命周期:全局變量的生命周期從程序開始執行到程序結束。
  • 作用域:全局變量的作用域是整個程序,任何函數都可以訪問和修改全局變量。
  • 存儲位置:全局變量通常存儲在靜態數據區(BSS段或數據段),并且在程序開始時被初始化。
  • 初始化:如果沒有顯式初始化,全局變量會被自動初始化為零(對于基本數據類型)。

示例

int globalVar = 10;  // 全局變量void foo() {globalVar = 20;  // 可以在函數中訪問和修改全局變量
}

(2) 靜態變量(Static Variables)

  • 定義:靜態變量是在函數內部或外部使用static關鍵字聲明的變量。對于函數內部的靜態變量,它的生命周期與程序的生命周期相同,但它的作用域僅限于函數內部。
  • 生命周期:靜態變量的生命周期從程序開始執行到程序結束,即使是局部靜態變量,它也不會在函數調用結束時銷毀。
  • 作用域
    • 局部靜態變量:僅限于聲明它的函數內部,其他函數無法訪問。
    • 全局靜態變量:作用域僅限于聲明它的源文件,其他源文件無法訪問(這時它是一個文件內部的全局變量,具有“內聯”特性)。
  • 存儲位置:靜態變量存儲在靜態數據區(BSS段或數據段)。
  • 初始化:靜態變量在程序啟動時自動初始化為零,如果顯式初始化則使用指定的值。

示例

void foo() {static int counter = 0;  // 靜態局部變量counter++;printf("Counter: %d\n", counter);
}

每次調用foo()時,counter會保留其上次的值,而不像普通局部變量那樣每次進入函數時都會被重新初始化。

(3) 常量(Constants)

  • 定義:常量是指值在程序運行時不能修改的變量。常量可以使用const關鍵字來聲明,或者使用#define宏定義。
  • 生命周期:常量的生命周期通常與它所在的程序區域相同,通常存儲在只讀數據區靜態數據區中。
  • 作用域:常量的作用域與其聲明的位置相關。局部常量僅限于其聲明的作用域,而全局常量可以在整個程序中訪問。
  • 存儲位置:常量通常存儲在程序的只讀數據區。
  • 初始化:常量在聲明時必須進行初始化,并且值在程序運行過程中不可修改。

示例

const int MAX_VALUE = 100;  // 常量,初始化后不能修改void foo() {// MAX_VALUE = 200;  // 錯誤,常量不能修改
}

區別總結:

特性全局變量靜態變量常量
定義位置函數外部定義函數內部或外部使用static關鍵字聲明使用const關鍵字或#define定義
生命周期程序從開始到結束程序從開始到結束程序從開始到結束
作用域程序中的任何地方都可以訪問僅限于函數或源文件僅限于其聲明的作用域
初始化如果沒有初始化,會被自動初始化為零如果沒有顯式初始化,會自動初始化為零必須在聲明時初始化,并且不可修改
存儲位置靜態數據區(BSS段或數據段)靜態數據區(BSS段或數據段)靜態數據區或只讀數據區
是否可修改可修改可修改(局部靜態變量,除非為常量)不可修改

關鍵點:

  • 全局變量:程序中的任何地方都可以訪問,生命周期貫穿整個程序。
  • 靜態變量:生命周期與程序相同,但作用域受限,可以是局部的(函數內部)或全局的(僅在文件內有效)。
  • 常量:值不可修改,初始化后不允許更改。

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

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

相關文章

消息中間件kafka,rabbitMQ

在分布式系統中,消息中間件是實現不同組件之間異步通信的關鍵技術。Kafka 和 RabbitMQ 是兩個非常流行的消息中間件系統,它們各自有著不同的特點和應用場景。下面將分別介紹 Kafka 和 RabbitMQ,并討論它們在消息隊列中的使用。 一、Kafka (Apache Kafka) 主要特點: 高吞吐…

2k1000LA , 調試串口改成通信串口, uart.

客戶的問題解決了,但是 調試串口 改成通信串口的問題,并沒有解決,我走的其他的路徑。 先準備一些資料。 以備以后使用。 網上的資料。 總結: 實際上 有幾種思路了。 1 就是更改 設備樹的 chosen 節點, 瑞芯微又單獨…

springboot集成spring-cloud-context手動刷新并讀取更新后的配置文件

背景 springboot單體項目在運行過程需要刷新springboot配置文件值,比如某個接口限流閾值,新增某個賬戶等場景。分布式設計的可以直接引入一些持久化中間件比如redis等,也可以用相關配置中心中間件如nacos等。處于成本等場景單體項目可以考慮①…

proteus8.17 環境配置

Proteus介紹 Proteus 8.17 是一款功能強大的電子設計自動化(EDA)軟件,廣泛應用于電子電路設計、仿真和分析。以下是其主要特點和新功能: ### 主要功能 - **電路仿真**:支持數字和模擬電路的仿真,包括靜態…

手機端可部署的開源大模型; 通義千問2.5訓練和推理需要的內存和外存

手機端可部署的開源大模型 目錄 手機端可部署的開源大模型Qwen2.5 0.5B 7b 推理采用手機內存需要多少Qwen2.5 0.5B不同量化精度下的內存需求Qwen2.5 7B不同量化精度下的內存需求通義千問2.5訓練和推理需要的內存和外存推理階段1. Qwen2.5 - 7B2. Qwen2.5 - 14B3. Qwen2.5 - 72B…

【uniapp-兼容性處理】swiper在iOS上偶發出現后幾張圖片白屏情況

【日期】2025-04-14 【問題】 swiper在iOS上偶發出現后幾張圖片白屏情況 swiper內部的幾個swiper-item垂直排列,各自進行滾動,樣式方面兼容性出現問題 【原因】: 原代碼:(不應在swiper-item添加style屬性&#xf…

SpringBoot連接MQTT客戶端

引入依賴 <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><version>1.2.2</version> </dependency> 啟動類 SpringBootApplication public class AxiosDemoApplic…

HTML:網頁的骨架 — 入門詳解教程

HTML&#xff1a;網頁的骨架 — 入門詳解教程 HTML&#xff08;HyperText Markup Language&#xff0c;超文本標記語言&#xff09;是構建網頁的基礎語言&#xff0c;負責定義網頁的結構和內容。無論是簡單的個人博客&#xff0c;還是復雜的企業網站&#xff0c;HTML都是不可或…

212、【圖論】字符串接龍(Python)

題目描述 題目鏈接&#xff1a;110. 字符串接龍 代碼實現 import collectionsn int(input()) beginStr, endStr input().split() strList [input() for _ in range(n)]deque collections.deque() # 使用隊列遍歷結點 deque.append([beginStr, 1]) # 存儲當前字符串和遍…

操作系統導論——第19章 分頁:快速地址轉換(TLB)

使用分頁作為核心機制來實現虛擬內存&#xff0c;可能會帶來較高的性能開銷。使用分頁&#xff0c;就要將內存地址空間切分成大量固定大小的單元&#xff08;頁&#xff09;&#xff0c;并且需要記錄這些單元的地址映射信息。因為這些映射信息一般存儲在物理內存中&#xff0c;…

使用Apache POI(Java)創建docx文檔和表格

1、引入poi 依賴組件 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.0.0</version> </dependency> <dependency><groupId>org.apache.poi</groupId>&…

python cv2 安裝

在Python中安裝opencv-python&#xff08;即OpenCV庫&#xff09;&#xff0c;通常有兩種方法&#xff1a;使用pip命令或通過conda&#xff08;如果你使用的是Anaconda或Miniconda&#xff09;。以下是詳細的步驟&#xff1a; 方法1&#xff1a;使用pip 打開你的命令行界面&am…

讀者、寫者問題優化

#include <stdio.h> #include <time.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> #define NUM_READERS 5 #define NUM_WRITERS 5 // 定義信號量和全局變量 sem_t sdata, srcount; int rea…

如何通過前端表格控件實現自動化報表?1

背景 最近伙伴客戶的項目經理遇見一個問題&#xff0c;他們在給甲方做自動化報表工具&#xff0c;項目已經基本做好了&#xff0c;但拿給最終甲方&#xff0c;業務人員不太買賬&#xff0c;項目經理為此也是天天抓狂&#xff0c;沒有想到合適的應對方案。 現階段主要面臨的問…

RabbitMQ 優先級隊列詳解

本文是博主在記錄使用 RabbitMQ 在執行業務時遇到的問題和解決辦法&#xff0c;因此查閱了相關資料并做了以下記載&#xff0c;記錄了優先級隊列的機制和使用要點。 本文為長文&#xff0c;詳細介紹了相關的知識&#xff0c;可作為學習資料看。 文章目錄 一、優先級隊列介紹1、…

代理模式簡述

目錄 一、主要角色 二、類型劃分 三、靜態代理 示例 缺點 四、動態代理 JDK動態代理 示例 缺點 CGLib動態代理 導入依賴 示例 五、Spring AOP 代理模式是一種結構型設計模式&#xff0c;通過代理對象控制對目標對象的訪問&#xff0c;可在不改變目標對象情況下增強…

每日一題——云服務計費問題

云服務計費問題&#xff08;哈希表 排序&#xff09;| 附詳細 C源碼解析 一、題目描述二、輸入描述三、輸出描述四、樣例輸入輸出輸入示例&#xff1a;輸出示例&#xff1a;說明&#xff1a; 五、解題思路分析六、C實現源碼詳解&#xff08;完整&#xff09;七、復雜度分析 一…

【JVM】運行時數據區域

文章目錄 1. 程序計數器補充 2. 虛擬機棧2.1 棧幀1. 局部變量表2. 操作數棧3. 動態鏈接4. 方法返回地址補充 3. 本地方法棧4. 堆5. 方法區靜態常量池&#xff08;Class常量池&#xff09;運行時常量池字符串常量池&#xff08;1&#xff09;位置變化&#xff08;2&#xff09;放…

day28圖像處理OpenCV

文章目錄 一、圖像預處理4 邊緣填充4.1 邊界復制&#xff08;BORDER_REPLICATE&#xff09;4.2 邊界反射&#xff08;BORDER_REFLECT&#xff09;4.3 邊界反射101&#xff08;BORDER_REFLECT_101&#xff09;4.4 邊界常數&#xff08;BORDER_CONSTANT&#xff09;4.5 邊界包裹&…

C++ Json-Rpc框架-3項目實現(2)

一.消息分發Dispatcher實現 Dispatcher 就是“消息分發中樞”&#xff1a;根據消息類型 MType&#xff0c;把消息派發給對應的處理函數&#xff08;Handler&#xff09;執行。 初版&#xff1a; #pragma once #include "net.hpp" #include "message.hpp"n…