C語言基礎—構造類型

數據類型

1.基本類型/基礎類型

  • 整型

    • 短整型:short[int] --2字節

    • 基本整型:int --4字節

    • 長整型:long[int] --32位4字節/64位8字節

    • 長長整型:long long [int] (C99)

      注意:以上類型又都分為signed(有符號)和unsigned(無符號)

  • 浮點型

    • 單精度:float --4字節

    • 雙精度:double --8字節

    • 長雙精度: long double --(C99新增)

  • 字符型

    • char -- 1字節

2.指針類型

  • 數據類型*:int* char* float* --8字節

  • void*:通用類型指針(萬能指針)--8字節

3.空值類型

  • void:無返回值,無形參(不能定義變量)

4.構造類型(自定義類型)

  • 結構體類型:struct

  • 共用體/聯合體類型:union

  • 枚舉類型:enum

結構體

結構體的定義(定義類型)

  • 定義:自定義數據類型的一種,關鍵字struct,結構體類型的變量可以存儲多個不同數據類型的數據。
  • 語法:
struct 結構體名    //定義數據類型名字
{數據類型1 成員名稱1;數據類型2 成員名稱2;...
}

注意:結構體中定義的變量,稱之為成員變量

  • 格式說明:

    • 結構體名:合法的標識符,建議首字母大寫(所謂的結構體名,就是自定義類型的類型名稱)

    • 數據類型n:C語言支持的所有類型(包括函數,函數在這里用函數指針表示)

    • 成員名稱n:合法的標識符,就是變量的命名標準

    • 數據類型n成員名稱n:類似于定義變量,定義了結構體中的成員

  • 注意:結構體在定義的時候,成員不能賦值
struct Cat
{int age = 5;    //錯誤double height;  //正確
}

常見的定義格式

  • 方式1:常規定義(命名結構體,只定義數據類型)---推薦

  • 方式2:定義匿名結構體(常用于作為其他結構體的成員使用)

  • 注意:定義匿名結構體的同時必須定義結構體成員,否則編譯報錯,結構體可以作為另一個結構體的成員(內嵌)

    總結:

    • 結構體可以定義在局部位置,也可以定義在全局位置(用的比較多,因為可以實現復用)

    • 全局位置的結構體名和局部位置的結構體名可以相同,遵循就近原則(和變量的定義同理)

  • 結構體類型的使用:

    利用結構體類型定義變量、定義數組、也可以作為函數的返回值和參數:結構體類型的使用與基本數據類型的使用類似。

結構體變量的定義(定義變量)

三種形式定義結構體變量

結構體變量也稱之為結構體實例

  • 第一種:

    ①先定義結構體(定義數據類型)

    ②然后使用(使用數據類型定義變量)

  • 第2種

    ①在定義結構體的同時,定義結構體變量

    舉例:

    ?struct A{int a;char b;}x,y;

    此時定義了一個結構體A,x和y是這個結構體類型的變量。

  • 第3種(不推薦)

    在定義匿名結構體的同時,定義結構體變量

struct A
{int a;char b;struct{int a1;char b1;}c,d;
}e;

此時定義了一個沒有名字的結構體(匿名結構體):c,d是這個結構體類型的變量

  • 匿名結構體

    • 優點:少些一個結構體名稱

    • 缺點:只能使用一次,定義結構體類型的同時必須定義變量

    • 應用場景:

      • 當結構體的類型只需要使用一次,并且定義類型的同時定義變量。

      • 作為其他結構體的成員使用。

  • 定義結構體的同時,定義結構體變量初始化

    • 結構體成員部分初始化時,大括號{}不能省略

    • 結構體成員,沒有默認值,是隨機值。

結構體變量的使用

  • 結構體變量訪問結構體成員

    • 語法:

      ?結構體變量名.成員名;

      ①可以通過訪問給成員賦值(存數據)

      ②可以通過訪問獲取成員的值(取數據)

    • 結構體變量未初始化,結構體的成員是隨機值(和普通的變量、數組同理)

  • 結構體變量在定義時,可以初始化

    • 建議用大括號標明數據的范圍

    • 結構體成員初始化,可以部分初始化(和數組類以),部分初始化時一定要帶大括號標明數據的范圍。

結構體數組的定義

  • 什么時候需要結構體數組

    比如:我們需要管理一個學生對象,只需要定義一個struct student kelei; 假如:我們需要管理一個班的學生對象,此時就需要定義一個結構體數組struct student stus[33];

  • 四種形式定義結構體數組

    • 第1種:結構體→結構體變量→結構體數組

    • 第2種:結構體→結構體數組,

    • 第3種:結構體、結構體數組一體化(含初始化)

    • 第4種:結構體、結構體數組一體化(不含初始化)

結構體數組的訪問

語法:

結構體 -> 成員名

舉例:

(*p).成員名
p -> 成員名

注意:

->[]共存的時候,它們的優先級關系:[]?>??->

構造體類型

構造體數組

舉例:

#include <stdio.h>#pragma pack(1)
struct Student
{char *name;int age;float score[3];
};
#pragma pack()void stu_print(struct Student *stu)
{printf("學生的名字是:%s\n",stu -> name);printf("學生的年齡是:%d\n",stu -> age);printf("語文成績是:%.2f\n",stu -> score[0]);printf("數學成績是:%.2f\n",stu -> score[1]);printf("英語成績是:%.2f\n",stu -> score[2]);
}int get_avg(struct Student *stu)
{struct Student *p = stu;for(; p < stu + 2; p++){float sum = 0;for(int i = 0; i < 3; i ++){sum += p -> score[i];}float avg = sum / 3;printf("%s的平均分為:%.2f\n",p -> name, avg);}
}
int main(int argc,char *argv[])
{struct Student stu = {"張三",20,{90,88,75}};stu_print(&stu);struct Student stus[] = {{"李四",21,{67,87,68}},{"王五",22,{76,92,70}}};get_avg(stus);return 0;
}

構造體指針

  • 定義:結構體類型的指針變量指向結構體變量或者數組的起始地址。

  • 語法:

struct 結構體名 *指針變量列表;
  • 舉例
#include <stdio.h>struct Product
{char *name;int id;int or_price;int now_price;char *production_deta;char *due_deta;
};typedef struct Product Pro;
//打印商品信息
void product_print(Pro *p)
{Pro *t_p = p;printf("名字是:%s\n",t_p -> name);printf("商品ID為:%d\n",t_p -> id);printf("原價為:%d\n",t_p -> or_price);printf("現價為:%d\n",t_p -> now_price);printf("生產日期:%s\n",t_p -> production_deta);printf("到期時間是:%s\n",t_p ->due_deta);
}
int main(int argc,char *argv[])
{//typedef struct Product Pro;Pro p1 = {"麻辣公主",10001,100,10,"2025,1,10","2025,2,10"};product_print(&p1);return 0;
}

構造體成員的訪問

結構體成員訪問

  • 結構體數組名訪問結構體成員

    • 語法

結構體數組名 -> 成員名;
(*結構體數組名).成員名;
  • 結構體成員訪問符

    • .左側是結構體變量,也可以叫做結構體對象訪問成員訪問符,右側是結構體成員。

    • ->左側是結構體指針,也可以叫做結構體指針訪問成員符右側是結構體成員

    • 舉例

struct Person *p = persons; // p就是結構體指針
for(; p < persons + 3; p++)printf("%s:%d\n",p -> name, p -> count);
結構體是自定義數據類型,它是數據類型,用法類似于基本類型的 int
結構體數組它是存放結構體對象的數組,類似于 int 數組存放 int 數據;
基本類型數組怎么用,結構體數組就怎么用 ---> 可以遍歷,可以作為形式參數,也可
以做指針等;

結構體類型求大小?

字節對齊

  • 字節對齊的原因:
???????1. 硬件要求 某些硬件平臺(如 ARM x86 )要求特定類型的數據必須對齊到特定地址,否則會 引發性能下降或硬件異常。
????????2. 優化性能 對齊的數據訪問速度更快。例如, CPU 訪問對齊的 int 數據只需一次內存操作, 而未對齊的數據可能需要多次操作。
  • 字節對齊規則
????????1. 默認對齊規則
?結構體的每個成員按其類型大小和編譯器默認對齊數(通常是類型的自然對齊數)對
?齊。 結構體的總大小必須是最大對齊數的整數倍。
????????2. 對齊細節
基本類型的對齊數 char 1 字節)、 short 2 字節)、 int 4 字節)、 double (8字節)。
結構體成員的對齊 :每個成員的起始地址必須是對齊數的整數倍。
結構體總大小的對齊 :結構體的總大小必須是其最大對齊數的整數倍
????????3. #pragma pack(n) 的影響 使用 #pragma pack(n) 可以強制指定對齊數為 n n 1 、 2、 4 8 16 )。此時:
每個成員的對齊數取 n 和其類型大小的較小值。
結構體的總大小必須是 n 和最大對齊數中的較小值的整數倍。

共用體

定義:使幾個不同變量占用同一段內存的結構。共用體按定義中需要存儲空間最大的成員來分
配存儲單元,其他成員也是使用該空間,它們的首地址是相同。
定義格式:
union 共用體名稱
{數據類型 成員名;數據類型 成員名;...
}
共用體的定義和結構體類似。
1.可以有名字,也可以匿名
2.共用體在定義時也可以定義共用體變量
3.共用體在定義時也可以初始化成員
4.共用體也可以作為形參和返回值類型使用
5.共用體也可以定義共用體變量
...
???????? 也就是說,結構體的語法,共用體都支持
注意:
????????共用體弊大于利,盡量少用,一般很少用;
????????共用體變量在某一時刻只能存儲一個數據,并且也只能取出一個數
????????共用體所有成員共享同一內存空間,同一時間只能存儲一個值,可能導致數據覆蓋
????????共用體和結構體都是自定義數據類型,用法類似于基本數據類型
?????????共用體可以是共用體的成員,也可以是結構體的成員
????????結構體可以是結構體的成員,也可以是共用體的成員

枚舉類型

建議:如果定義不相干的常量,使用宏定義(符號常量);如果需要定義一組相關的常量,如月份0~11,星期0-6,方向0-3等,使用枚舉,進行統一管理。以后正式開發中,switch的case后訪問的就是枚舉中的常量。

  • 定義

    我們一般情況下,定義常量使用宏定義(#define 宏名稱 值),宏定義非常適合沒有關聯關系的常量;但是有時候我們可能需要對一組擁有關聯關系的量進行定義,如月份0~11,星期0-6,方向0-3等,那么使用宏定義,就不是很清晰,也不方便統一管理,這個時候就需要用到枚舉。

    枚舉的存在就是將多個擁有關聯關系的常量組合到一起,提高代碼的可讀性。

  • 說明

    枚舉類型定義了一組常量,我們在開發中直接使用這些常量。(常用)

    當然枚舉類型也可以類似于結構體一樣定義變量等操作。(不常用)

    枚舉常量有默認值,從0開始依次+1我們可以在定義時指定它的默認值,如果個別沒有斌值,可以根據賦值依次+1推導。

  • 特點

    定義了一組常量,類似于定義了多個符號常量(宏定義)。

    提高了代碼的可讀性。

  • 語法:

  • 定義枚舉類型名以后就可以定義該枚舉類型的變量。(枚舉的成員是常量)

enum 枚舉類型名 變量列表;

? ? ? ?在定義枚舉類型的同時定義該枚舉類型的變量。

enum 枚舉類型名(枚舉元素列表) 變量列表;

? ? ? 直接定義枚舉變量(變量)。

enum(枚舉元素列表) 變量列表;

typedef

  • 說明:給類型重命名,不會影響到類型本身。

  • 作用:給己有的類型起別名

  • 格式:

typedaef 已有類型名 新類型名;
  • 舉例:
#include <stdio.h>struct Product
{char *name;int id;int or_price;int now_price;char *production_deta;char *due_deta;
};typedef struct Product Pro;
//打印商品信息
void product_print(Pro *p)
{Pro *t_p = p;printf("名字是:%s\n",t_p -> name);printf("商品ID為:%d\n",t_p -> id);printf("原價為:%d\n",t_p -> or_price);printf("現價為:%d\n",t_p -> now_price);printf("生產日期:%s\n",t_p -> production_deta);printf("到期時間是:%s\n",t_p ->due_deta);
}
int main(int argc,char *argv[])
{//typedef struct Product Pro;Pro p1 = {"麻辣公主",10001,100,10,"2025,1,10","2025,2,10"};product_print(&p1);return 0;
}
  • 應用場景:

    • 數據類型復雜(結構體、共用體、枚舉、結構體指針、無符號的長整型)時使用

    • 為了跨平臺的兼容性,例如:

    1. size_t:類型重名后的數據類型:typedef unsigned long size_t;

    2. unit16:類型重命名后的數據類型。

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

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

相關文章

2025年高壓電工考試真題分享

以下是一些高壓電工考試題&#xff1a; 單選題 1、高壓架空線路的檔距一般為&#xff08; &#xff09;。 A. 20 - 30m B. 30 - 50m C. 50 - 80m D. 80 - 100m 答案&#xff1a;B。解析&#xff1a;高壓架空線路檔距一般在 30 - 50m&#xff0c;這樣的檔距能較好地保證線…

什么是SQL作業

SQL作業是在數據庫服務器上按特定時間或間隔自動執行的計劃任務或流程&#xff0c;這些作業由Microsoft SQL Server中的SQL Server代理管理&#xff0c;對于自動執行日常任務&#xff08;如數據庫系統中的備份、數據導入和報告生成&#xff09;以及確保及時準確地處理和更新數據…

【數據分享】基于聯合國城市化程度框架的全球城市邊界數據集(免費獲取/Shp格式)

在全球城市化進程不斷加快的今天&#xff0c;如何精準定義和測量“城市”成為關鍵問題。不同國家和機構采用不同的標準&#xff0c;導致全球城市化水平的統計結果存在較大差異。同時&#xff0c;由于數據來源分散、標準不統一&#xff0c;獲取一套完整、可比的全球城市邊界數據…

劉火良FreeRTOS內核實現與應用學習之6——多優先級

在FreeRTOS中&#xff0c;數字優先級越小&#xff0c;邏輯優先級也越小&#xff1b;在任務創建時&#xff0c;會根據任務的優先級將任務插入就緒列表不同的位置。 List_t pxReadyTasksLists[ configMAX_PRIORITIES ] 就緒列表是一個數組&#xff0c;數組中存儲的是就緒任務TCB(…

生成信息提取的大型語言模型綜述

摘要 信息提取&#xff08;IE&#xff09;旨在從簡單的自然語言文本中提取結構知識。最近&#xff0c;生成型大型語言模型&#xff08;LLMs&#xff09;在文本理解和生成方面表現出了顯著的能力。因此&#xff0c;已經提出了許多基于生成范式將LLM集成到IE任務中的工作。為了對…

簡單談談很火的MCP( Model Context Protocol,模型上下文協議)

MCP( Model Context Protocol&#xff0c;模型上下文協議)是由Anthropic推出的開放協議&#xff0c;并非獨立的大模型&#xff0c;而是連接大模型與外部工具/數據源的標準化接口?&#xff0c;旨在解決AI工具開發中接口不統一、跨模型共享困難等問題。? 一、工作原理 MCP 協…

解決linux centos ubuntu等無法啟動谷歌chrome瀏覽器問題

命令啟動chrome時候提示&#xff1a; Running as root without --no-sandbox is not supported. See https://crbug.com/638180. 解決無法啟動谷歌chrome瀏覽器&#xff1a; cd /usr/bin 發現目錄下有 google-chrome google-chrome-stable 執行&#xff1a; vim go…

深入解析緩沖區:計算機世界的“蓄水池”與“加速器”

引言 想象這樣一個場景&#xff1a; 你的手機正在播放4K視頻&#xff0c;同時下載大型文件 視頻畫面流暢無卡頓&#xff0c;下載速度穩定在滿帶寬 但手機的內存只有8GB&#xff0c;下載文件的大小卻超過20GB 這看似矛盾的現象背后&#xff0c;緩沖區&#xff08;Buffer&am…

網絡故障診斷

一 網絡故障診斷的方法 1 試錯法&#xff1a;通過推測提出解決方案&#xff0c;最后得出故障原因的方法。 2 參照法&#xff1a;是一種比較快速解決網絡故障的方法&#xff0c;只有當故障設備與正常工作設備具有相近的條件時&#xff0c;才可以使用參照法。 3 替換法&#xff1…

界面控件Telerik和Kendo UI 2025 Q1亮點——AI集成與數據可視化

Telerik DevCraft包含一個完整的產品棧來構建您下一個Web、移動和桌面應用程序。它使用HTML和每個.NET平臺的UI庫&#xff0c;加快開發速度。Telerik DevCraft提供完整的工具箱&#xff0c;用于構建現代和面向未來的業務應用程序&#xff0c;目前提供UI for ASP.NET MVC、Kendo…

ollama遷移已下載的單個模型到服務器

ollama遷移已下載的單個模型到服務器 場景 ollama是面向用戶級的&#xff0c;部署和運行都很簡單&#xff0c;是否高效就另說了。但最起碼&#xff0c;他能充分利用用戶的硬件設備&#xff0c;在GPU不足也能調用cpu和內存去加持。 ollama運行的模型基本是量化版本的&#xf…

怎么對asp.web api進行單元測試?

在 ASP.NET Web API 中進行單元測試是一種確保代碼質量和功能正確性的重要實踐。單元測試的重點是針對 API 控制器中的邏輯進行測試&#xff0c;而不依賴于外部依賴&#xff08;如數據庫、文件系統或網絡請求&#xff09;。以下是實現 ASP.NET Web API 單元測試的步驟和方法&am…

UDP視頻傳輸中的丟包和播放花屏處理方法

在處理UDP視頻傳輸中的丟包和花屏問題時,需要結合編碼優化、網絡傳輸策略和接收端糾錯技術。以下是分步驟的解決方案: 1. 前向糾錯(FEC,Forward Error Correction) 原理:在發送數據時附加冗余包,接收方通過冗余信息恢復丟失的數據包。 實現方法: 使用Reed-Solomon、XO…

WebGL圖形編程實戰【3】:矩陣操控 × 從二維到三維的跨越

上一篇文章&#xff1a;WebGL圖形編程實戰【2】&#xff1a;動態著色 紋理貼圖技術揭秘 倉庫地址&#xff1a;github…、gitee… 矩陣操控 矩陣變換 回到前面關于平移縮放、旋轉的例子當中&#xff0c;我們是通過改變傳遞進去的xy的值來改變的。 在進行基礎變換的時候&…

并發編程--共享內存SHM

共享內存SHM 文章目錄 共享內存SHM1. 基本概念2. 函數接口2.1 創建或打開SHM對象2.2 映射 / 解除映射SHM對象2.3 其余操作2.4示例代碼 1. 基本概念 共享內存&#xff0c;顧名思義&#xff0c;就是通過不同進程共享一段相同的內存來達到通信的目的&#xff0c;由于SHM對象不再交…

Redis中的數據類型與適用場景

目錄 前言1. 字符串 (String)1.1 特點1.2 適用場景 2. 哈希 (Hash)2.1 特點2.2 適用場景 3. 列表 (List)3.1 特點3.2 適用場景 4. 集合 (Set)4.1 特點4.2 適用場景 5. 有序集合 (Sorted Set)5.1 特點5.2 適用場景 6. Redis 數據類型的選型建議結語 前言 Redis 作為一款高性能的…

科技賦能建筑業變革:中建海龍創新引領高質量發展新路徑

在建筑工業化浪潮中&#xff0c;中建海龍科技有限公司&#xff08;以下簡稱“中建海龍”&#xff09;憑借深厚的技術積累與持續創新&#xff0c;成為推動行業轉型升級的標桿企業。作為中國建筑國際集團旗下核心科技力量&#xff0c;中建海龍深耕模塊化集成建筑&#xff08;MiC&…

Vue下 Sortable 實現 table 列表字段可拖拽排序,顯示隱藏組件開發

vue 開發table 列表時&#xff0c;需要動態調整列字段的順序和顯示隱藏 實現效果如圖所示&#xff1a; vue 組件代碼 <template><div style"width: 90%; margin: 0 auto;"><el-table :data"tableData" border"" ref"table…

故障扭曲棱鏡反射照片效果ps特效濾鏡樣機 Distorted Mirror Poster Effect

只需單擊幾下即可執行令人著迷的高質量圖像和攝影&#xff01;此照片效果包含智能對象圖層&#xff0c;提供完全自定義、易用性和多功能性的工作流程。只需雙擊其縮略圖打開所需的圖層&#xff0c;刪除占位符鏡頭&#xff0c;添加圖形&#xff0c;保存它&#xff0c;然后觀看 P…

基于dify平臺批量分析excel格式信息

如何以表格形式批量輸入一些信息&#xff0c;然后讓大模型以對話應用形式逐條進行推理分析&#xff1f; 這里提供一個分步解決方案&#xff0c;結合 Dify平臺功能 和 API調用優化 的思路&#xff0c;既保證效率又降低復雜度&#xff1a; 1. 優先檢查 Dify 的「數據集」功能 Di…