二、重學C++—C語言核心

上一章節:

一、重學C++—C語言基礎-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146002496?spm=1001.2014.3001.5502

本章節代碼:

cPart2 · CuiQingCheng/cppstudy - 碼云 - 開源中國https://gitee.com/cuiqingcheng/cppstudy/tree/master/cPart2

一、數組

數組:可以形象理解為一個整齊放置盒子的架子,每個盒子里放置了一種定義好類型的數據,每個盒子有自己的編號,編號為整型,從0依次往上遞增。

1、數組的定義與使用

類型 數組名[數組大小]

int number[5];
1.1關于數組大小的三點說明:

(1)、數組若在定義時,不給數組賦值,則必須要指定其數組大小,且數組大小為常量,可以是數值常量,也可以是普通常量,這里就可以聯系上面例子,列舉放盒子的架子,一樣,如果都不知道有多少個盒子,那么數組這個架子該如何創建大小。

(2)、數組若定義時,就給初始化賦值了,如下:

int number[]={1,2,3,4,5};

這里就已經指定了多少個放數據的盒子,所以這里就可以不需要對數組大小進行說明。

(3)、除了上述兩種,當數組作為形參時,不需要指定大小。(形參,可以先記下,后續函數中會講解)

void printArray(int arr[]) {// 函數體
}
1.2、二維數組和多維數組

二維數組:一維數組構成的架子壘起來,按照行進行存儲數據;

二維數組中可以把?行數省略,列數不能省略

int a[4][4];
int b[][4] = {1,2,3,4,21,22,23,24};

多維數組:a[][3][4]....:只能省略第一個[]中的數

        // 數組int a[10];for(int i = 0; i < 10; ++i){a[i] = i*10;}printf("arr a size : %d\n", sizeof(a));// 獲取數組所占字符數int  b[SIZE];for(int j = 0; j < SIZE ; j++){b[j] = a[j] / 2;}float fArr[] = {3.4, 4.5, 6.6};int num[2][4];int nn[][2] = {1,2,3,4,21,22,23,24}; // 多維數組初始化后可以不指定,第一維大小

二、指針

指針可以理解成是一個特殊的 “身份證”,這個身份證上記錄著某個東西存放的位置,以及這個位置的名稱。

指針的本質

在計算機的內存里,每個存儲單元都有一個獨一無二的地址,就好像每個房間都有一個門牌號一樣。指針就是用來存放這些地址的變量。

例如:

int num = 10;
int *p;                // 指針的定義
p = &num;              // '&'這個符號時取地址,將地址值付給指針P
printf("%d\n", *p);    // '*'這個符號表示取值,表示將P這個地址下的值取出來。
printf("pointer size:%d\n", sizeof(p));     // 獲取指針大小,32位系統,就是4個字節,64位系統,就是8個字節;
printf("pointer = %p\n",p);//%p表示按照16進制的形式輸出

指針用來存放內存地址,因為在同一個系統下,指針的大小是固定的,比如在32位系統下,指針對應的大小就是4個字節。

指針相關的運算符

&:取地址運算符,運算結果為操作數的指針

*:指針運算符,運算結果為指針所指向的數據的引用

指針進行 +/-運算。

        int *p;                // 指針的定義p = &num;              // '&'這個符號時取地址,將地址值付給指針Pprintf("%d\n", *p);    // '*'這個符號表示取值,表示將P這個地址下的值取出來。printf("pointer size:%d\n", sizeof(p));     // 獲取指針大小,32位系統,就是4個字節,64位系統,就是8個字節;printf("pointer = %p\n", p);//%p表示按照16進制的形式輸出指針地址。int data[4] ={3,4,5,6};int *pNum = data;           // 數組名為指針,數組名是指針常量,不能改變。pNum++;printf("pNum -> value: %d\n", *pNum);   // 指針 ++,表示指針所直指向的內存地址,增加了一個int型數據的間隔。所以這里輸出 4int *pData = &data[3];  // 將數組的第四個數據地址賦值給pData;pData -= 1;printf("pData -> value: %d\n", *pData);   // 指針-1,表示指針所直指向的內存地址,減少了一個int型數據的間隔。所以這里輸出 5// 指針在進行加減時,要注意不要訪問越界。

指針常量(指針類型的常量:指針本身市場量):一旦定義就不能被賦值、改變,但是可以改變指針所指向的數據。

常量指針(常量的指針:指針指向的是常量):它被指向的一個數是一個常量(在指針看來,也就是說通過p無法去修改它所指向的地址的數據,但是p本身是變量,可以對他進行賦值,更改

常量指針常量(指針本身是常量,指針指向的也是常量):定義的標識符是個常量的指針所以他的值不能任意改變,也就是他所指向的地址值不能變,同時由于他是一個指針型的常量,所以他對應的地址的值,不能是賦值,只能讀取。

二級指針和多級指針

二級指針,指針的指針,即指針變量的地址;這里一般用于存放某個數據單元的地址的地址,這樣要修改這個地址下創建的地址,可以這樣使用,建議不要用太多級指針。一般到二級,就可以了,否則代碼可讀性會大大降低,從而增加調試理解難度。

三、函數

函數:可以形象的理解為一個個小的 “工作車間”,每個車間都有特定的任務,能幫你把復雜的大工作拆分成很多小工作,讓程序更有條理。

函數定義:

上面形象的把函數比喻成一個“工作車間”,那么一個車間實現某個具體功能時,往往需要原材料,即函數參數-》形參,函數工作完了,會輸出一個結果,或者是返回某個狀態,這里就有返回值,跟出參的概念。

例如下,計算兩數之和:

int add(int a, int b) {return a + b;
}
  • int:這是函數的返回類型,說明這個函數做完工作后會返回一個整數。
  • add:這是函數的名字,就像車間的名字,方便我們后面調用它。
  • (int a, int b):這是函數的參數列表,也就是這個車間需要的材料。這里需要兩個整數ab
  • return a + b;:這是函數的核心工作內容,把兩個數相加,然后把結果返回出去。

函數調用:

函數的聲明定義,必須要在函數調用前,這里很好理解,若為進行聲明定義,那么調用處怎么會知道這個函數的組成。

定義好函數后,就可以在其他地方調用它,就像在需要的時候去使用某個車間。比如:

#include <stdio.h>int add(int a, int b) {return a + b;
}
void addOutput(int n, int m, int *sum)
{*sum = n+m;n+=5;m+=10;if((*sum) < 400){addOutput(n,m,sum); // 遞歸調用}
}int main() {int result = add(3, 5);printf("兩數之和是: %d\n", result);int sum = 0, k = 66;addOutput(result, k, &sum);    // 這里的sum是出參, result/k,為入參 返回值為voidprintf("sum: %d, k = %d, result=%d \n", sum, k, result);int (*pAdd)(int, int);  // 函數指針pAdd = add;int ret = pAdd(39,45);printf("ret: %d\n", ret);return 0;
}

函數的遞歸調用:即在函數執行代碼段中的某一個環節,繼續調用該函數,這里要注意,遞歸要設立退出機制,不能讓函數一直處于遞歸調用循環的狀態。

函數的作用

代碼復用:如果有一段代碼需要在不同的地方多次使用,就可以把它寫成一個函數。這樣每次需要用的時候,直接調用函數就行,不用重復寫代碼。比如上面的add函數,在很多地方要計算兩數之和時,都能調用它。

模塊化設計:把一個大的程序拆分成很多小的函數,每個函數負責一個小任務。這樣程序的結構會更清晰,也更容易維護和調試。就像一個大工廠,分成很多小車間,每個車間負責一部分工作,管理起來更方便。

函數代碼太長,要進行拆分成小的功能模塊。

函數的參數和返回值

函數的參數:就是如上面的 int a, int b,這里為函數的形參,按照功能又可以分為,入參,跟出參,比如這里的sum就是出參,傳遞的是指針,在函數執行完后,指針指向的位置,值發生了修改,而另外兩個參數的值不發生改變。

返回值:函數可以有返回值,也可以沒有返回值(返回類型為

void)。返回值就像是車間產出的產品,函數做完工作后把結果返回出去。如果函數不需要返回結果,就用

void作為返回類型。

函數指針:函數名為函數的指針。

四、結構體

結構體就像是一個 “收納盒”,可以把不同類型的數據收納在一起,形成一個新的數據類型。

結構體的定義

定義結構體就像是設計一個收納盒,要說明這個盒子里可以放哪些東西。比如,你想設計一個收納盒來存放一個人的信息,包括姓名、年齡和身高,就可以這樣定義:

struct Person {char name[20];  // 姓名int age;        // 年齡float height;   // 身高
};

結構體變量的定義和使用

定義好結構體后,就可以用它來創建具體的變量,就像按照設計好的收納盒樣式做出一個個實際的盒子。例如:

#include <stdio.h>
#include <string.h>struct Person {char name[20];int age;float height;
};int main() {// 定義一個結構體變量struct Person p1;// 給結構體變量的成員賦值strcpy(p1.name, "張三");p1.age = 20;p1.height = 1.75;// 輸出結構體變量的成員值printf("姓名: %s\n", p1.name);printf("年齡: %d\n", p1.age);printf("身高: %.2f\n", p1.height);return 0;
}

結構體的作用

組織數據:當需要處理一組相關的數據時,把它們放在一個結構體里,能讓數據的組織更有條理。比如上面的例子,把一個人的姓名、年齡和身高放在一個結構體里,方便對這個人的信息進行管理。

函數參數傳遞:可以把結構體作為函數的參數傳遞,這樣就能一次性傳遞多個相關的數據。例如,寫一個函數來打印輛車的信息:

#include <stdio.h>
#include <string.h>
struct Person {char name[20];int age;float height;
};typedef struct car{char name[20];  // 名稱float  wight;     // 寬高float height;char colorChr[20];  //顏色
}CAR;void printCar(CAR C1) {printf("品牌: %s\n", C1.name);printf("顏色: %s\n", C1.colorChr);printf("高: %.2f\n", C1.height);printf("寬: %.2f\n", C1.height);
}int main() {// 定義一個結構體變量struct Person p1;// 給結構體變量的成員賦值strcpy(p1.name, "張三");p1.age = 20;p1.height = 1.75;// 輸出結構體變量的成員值printf("姓名: %s\n", p1.name);printf("年齡: %d\n", p1.age);printf("身高: %.2f\n", p1.height);// 定義一個變量車CAR C1;strcpy(C1.name, "奔馳");strcpy(C1.colorChr, "red");C1.height = 1.7;C1.wight = 2.2;printCar(C1);return 0;
}

注意:

在暴露給外部調用時,盡量不要使用結構體傳參數,這樣針對只是少數值修改時,不需要創建整個結構體對象。

五、共用體(使用場景較少)

在 C 語言里,共用體(也叫聯合體)就像是一個特殊的 “小房間”,這個房間每次只能住 “一個人”,也就是每次只能存放一種數據,但可以存放不同類型的數據。

共用體的定義

定義共用體就像是設計這個特殊的 “小房間”,要說明這個房間可以讓哪些 “人” 住進來,也就是能存放哪些類型的數據。比如,你設計一個房間,它既可以讓一個整數 “住”,也可以讓一個浮點數 “住”,就可以這樣定義:

union Data {int i;float f;
};

union:這是定義共用體的關鍵字。

Data:這是共用體的名字,就像房間的名字,方便后面使用。

大括號里的內容就是這個房間可以容納的數據類型,這里有一個整數i和一個浮點數f。

共用體變量的定義和使用

定義好共用體后,就可以用它來創建具體的變量,就像按照設計好的房間樣式造一個實際的房間。例如:

#include <stdio.h>union Data {int i;float f;
};int main() {// 定義一個共用體變量union Data d;// 給共用體變量的整數成員賦值d.i = 10;printf("整數的值: %d\n", d.i);// 給共用體變量的浮點數成員賦值d.f = 3.14;printf("浮點數的值: %.2f\n", d.f);printf("整數的值: %d\n", d.i);// 這里整型數據已經被覆蓋return 0;
}

在這個例子中,union Data d;創建了一個名為d的共用體變量。然后通過.操作符來訪問共用體變量的成員,給它們賦值并輸出。要注意,每次給一個成員賦值后,之前存的數據就會被覆蓋,因為這個 “小房間” 每次只能住 “一個人”。

共用體可以節省內存空間,現階段,內存空間往往十分充裕,因而,共用體使用面就減少了。

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

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

相關文章

2-003:MySQL 三層 B+ 樹能存多少數據?

1. 計算 B 樹能存儲多少數據 參數設定 每個數據頁&#xff08;Page&#xff09;大小&#xff1a;16KB&#xff08;16384 字節&#xff09;每個索引節點存儲的子節點數量&#xff1a; 索引項大小&#xff1a; 假設 bigint&#xff08;主鍵&#xff09;占 8 字節每個索引項存儲…

幾種常見的虛擬環境工具(Virtualenv、Conda、System Interpreter、Pipenv、Poetry)的區別和特點總結

在 PyCharm 中創建虛擬環境是一個非常直接的過程&#xff0c;可以幫助你管理項目依賴&#xff0c;確保不同項目之間的依賴不會沖突。 通過 PyCharm 創建虛擬環境 打開 PyCharm 并選擇或創建一個項目。 打開項目設置&#xff1a; 在 Windows/Linux 上&#xff0c;可以通過點擊…

Windows系統編程項目(四)窗口管理器

本章我們講解基于對話框的MFC窗口相關的操作 該管理器要實現以下功能 初始化列表 初始化列表表頭 初始化圖像列表 初始化列表 功能實現 加載菜單 刷新列表 結束進程 隱藏窗口 最大化窗口 最小化窗口 手搓窗口管理器 // CWindowManage.cpp: 實現文件 //#include "pch.h&…

優化 NFS 掛載參數以提升可靠性與容錯性

在現代 IT 基礎設施中&#xff0c;NFS&#xff08;網絡文件系統&#xff09;被廣泛用于共享文件和存儲。雖然 NFS 提供了便利&#xff0c;但在某些情況下&#xff0c;掛載失敗或網絡問題可能導致掛載操作不穩定。為了提高掛載的可靠性和容錯性&#xff0c;我們可以通過優化 NFS…

JavaScript事件循環機制

JavaScript 事件循環機制&#xff08;Event Loop&#xff09;詳解 JavaScript 是 單線程、非阻塞 語言&#xff0c;依賴 事件循環&#xff08;Event Loop&#xff09; 來實現異步編程。它的執行模型包括 調用棧&#xff08;Call Stack&#xff09;、任務隊列&#xff08;Task …

大模型架構記錄4-文檔切分 (chunks構建)

chunks&#xff1a; 塊 trunks : 樹干 “RAG”通常指 檢索增強生成&#xff08;Retrieval-Augmented Generation&#xff09; 主要框架&#xff1a;用戶提query&#xff0c;找到和它相關的&#xff0c;先把問題轉換為向量&#xff0c;和向量數據庫的數據做比較&#xff0c;檢…

物聯網IoT系列之MQTT協議基礎知識

文章目錄 物聯網IoT系列之MQTT協議基礎知識物聯網IoT是什么&#xff1f;什么是MQTT&#xff1f;為什么說MQTT是適用于物聯網的協議&#xff1f;MQTT工作原理核心組件核心機制 MQTT工作流程1. 建立連接2. 發布和訂閱3. 消息確認4. 斷開連接 MQTT工作流程圖MQTT在物聯網中的應用 …

第27周JavaSpringboot電商進階開發 1.企業級用戶驗證

課程筆記&#xff1a;注冊郵箱驗證 一、概述 從本小節開始&#xff0c;將學習如何進行注冊郵箱驗證。主要任務是給項目配置一個公共郵箱&#xff08;可自己注冊或由公司提供&#xff09;&#xff0c;用于向用戶發送驗證碼&#xff0c;幫助用戶完成注冊流程。課程中以QQ郵箱為…

數據庫---sqlite3

數據庫&#xff1a; 數據庫文件與普通文件區別: 1.普通文件對數據管理(增刪改查)效率低 2.數據庫對數據管理效率高,使用方便 常用數據庫: 1.關系型數據庫: 將復雜的數據結構簡化為二維表格形式 大型:Oracle、DB2 中型:MySql、SQLServer …

音視頻軟件工程師面試題

一、基礎知識 編解碼相關 H.264 和 H.265(HEVC)的主要區別是什么?視頻編解碼的基本流程是什么?關鍵技術有哪些?音頻編解碼(如 AAC、MP3、Opus)的區別和應用場景?什么是 B 幀、P 幀、I 幀?它們的作用是什么? 流媒體協議RTMP、HTTP-FLV、HLS、WebRTC 的區別和應用場景…

【系統架構設計師】測試方法

目錄 1. 說明2. 靜態測試3. 動態測試4. 黑盒測試5. 白盒測試6. 灰盒測試7. 自動化測試8.例題8.1 例題1 1. 說明 1.軟件測試方法的分類有很多種&#xff0c;以測試過程中程序執行狀態為依據可分為靜態測試&#xff08;Static Testing&#xff0c;ST&#xff09;和動態測試&…

tomcat配置應用----server.xml文件具體配置

1.tomcat項目目錄 默認項目目錄&#xff1a;tomcat安裝目錄/webapps目錄 如上圖所示&#xff0c;在tomcat的項目目錄下有很多子文件夾&#xff0c;這些子文件夾中都有一個項目首頁。 如上圖所示&#xff0c;將來我們去使用IP加端口號的方式去訪問tomcat的時候&#xff0c;默認是…

Spring Boot 調用DeepSeek API的詳細教程

目錄 前置準備步驟1&#xff1a;創建Spring Boot項目步驟2&#xff1a;配置API參數步驟3&#xff1a;創建請求/響應DTO步驟4&#xff1a;實現API客戶端步驟5&#xff1a;創建控制器步驟6&#xff1a;異常處理步驟7&#xff1a;測試驗證單元測試示例Postman測試請求 常見問題排查…

多維數據聚合方案:SQL GROUPING SETS深度解析

一、什么是GROUPING SETS&#xff1f; GROUPING SETS是SQL標準中的多維聚合運算符&#xff0c;允許在單個查詢中實現多維度組合的分組統計。相較于傳統UNION ALL方案&#xff0c;性能可提升3-10倍&#xff08;TPC-DS基準測試&#xff09;。 二、核心語法解析 SELECT column1,…

Excel中國式排名,3種方法!

大家好&#xff0c;我是小魚。 什么是中國式排名呢&#xff1f; 舉個例子比如說公司一共有10名員工進行成績考核&#xff0c;如果9個人考核成績都是90分&#xff0c;你是89分&#xff0c;按照國際慣用的排名法則&#xff1a;9 個人考核成績并列第一&#xff0c;你第10名&…

哪些業務場景更適合用MongoDB?何時比MySQL/PostgreSQL好用?

哪些業務場景更適合用MongoDB&#xff1f;何時比MySQL/PostgreSQL好用&#xff1f; 就像淘寶的個性化推薦需要靈活調整商品標簽&#xff0c;MongoDB這種"變形金剛"式的數據庫&#xff0c;在處理以下三類中國特色業務場景時更具優勢&#xff1a; 一、動態數據就像&q…

深度解讀:OpenAI發布GPT-5的技術突破與商業影響

引言 2025年2月&#xff0c;OpenAI正式發布GPT-5&#xff0c;這一被譽為“AI新紀元開篇之作”的模型&#xff0c;不僅實現了技術架構的顛覆性創新&#xff0c;更以免費開放策略引發行業地震。本文將從技術突破、商業影響、行業競爭格局及未來挑戰四個維度&#xff0c;全面解析…

網絡防火墻是什么有什么用_網絡防火墻:守護信息安全的重要屏障

網絡防火墻的基本概念 網絡防火墻是網絡安全領域的重要組成部分&#xff0c;它充當著內部網絡和外部網絡之間的安全防護層。防火墻能夠監控和控制進出網絡的數據流&#xff0c;只允許符合安全策略的信息通過&#xff0c;從而有效阻止潛在威脅的入侵。簡而言之&#xff0c;網絡…

C# WPF 串口通信

C# WPF 串口通信 安裝依賴庫 安裝依賴庫 System.IO.Ports using System.Diagnostics; using System.IO.Ports; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windo…