C 語言結構體

由于近期項目需求,需使用到大量的指針與結構體,為更好的完成項目,故對結構體與指針的內容進行回顧,同時撰寫本博客,方便后續查閱。

本博客涉及的結構體知識有:

1.0:結構體的創建和使用

2.0:? typedef 關鍵字與#define 關鍵字的區別

3.0:? 結構體成員的訪問【地址訪問與成員訪問】

4.0: 結構體嵌套調用

......


1.0:結構體的創建和使用

結構體類型和枚舉類型一樣,是一種用戶自定義的數據類型,它可以使用一個變量來描述事物的多種屬性,便于數據的管理,數據類型聲明的語法格式:

// 結構體的聲明格式
typedef struct
{成員列表
}structName_t;注:成員列表中的成員并不是變量在什么的時候并不會開辟內存空間內存空間的開辟要在創建結構體變量之后************************************  結構體: 創建結構體案例*  參數  : 結構體成員 char name[20]; char tel[12];*  返回值: 無*  時間  : 2024/7/13 *  作者  : _滄浪之水_************************************ 
**/
typedef struct
{char name[20];char tel[12];char sex[5];int high;
}People_t;

結構體變量的定義

/**************************************  結構體: 結構體變量定義后同時進行賦值*  參數  : 無參數*  返回值: 無返回值*  時間  : 2024/7/13 *  作者  : _滄浪之水_************************************
**/
People_t peo = { "張三","15863310892","男",181 };

2.0 typedef 關鍵字的使用

typedef關鍵關鍵字:用于定義一個已有關鍵字的別名,具體創建格式如下所示

/**************************************  結構體: typedef 關鍵字的用法*  參數  : 無參數*  返回值: 無返回值*  時間  : 2024/7/13 *  作者  : _滄浪之水_************************************
**/
typedef 數據類 名字typedef uint8_t uint;typedef unsigned char uchar;

typedef 關鍵字和define關鍵字的區別,兩者都是給對象取一個別名增強程序的可讀性【盡量防止程序中魔鬼數字的出現】,兩者有如下的區別

1: 使用場景不同

typedef 關鍵字用于給數據類型定義別名

#define關鍵字又稱為(宏定義) 用于給數字,表達式(寫表達式時注意帶上括號防止異常問題的出現),代碼語句定義別名。

2:執行時機不同

typedef在編譯階段執行;

#define在預編譯階段執行;

3:定義方法不同

#define別名在替換對象的前面,并且定義后面不用加分號;

#define PI 3.14#define MAX_NUM_LIST 9

typedef的別名在替換對象的后面,并且定義后面需要加分號;

typedef unsigned char uchar;

3.0:? 結構體成員的訪問

注:有指針訪問和圓點運算符訪問兩種訪問方式

使用圓點運算符并打印輸出

    /**************************************  結構體: 結構體成員變量訪問*  參數  : 結構體成員訪問*  返回值: 無*  時間  : 2024/7/13 *  作者  : _滄浪之水_**************************************/// peo 是結構體變量,結構體變量創建后才會開辟內存控制,結構體變量初始化People_t peo = { "張三","15863310892","男",181 };// 浮點數在內存中不能精確的存儲,結構體嵌套初始化recallStruct_t recal = { {"李四","15863310892","男",181},100, 88.8f };printf("%s %s %s %d\n", peo.name, peo.tel, peo.sex, peo.high);printf("%s %s %s %d %d %f\n", recal.p.name,recal.p.tel,recal.p.sex, recal.p.high,recal.num,recal.f);

使用指針訪問【地址訪問】

/**************************************  結構體: 結構體傳遞地址調用*  參數  : *p 指針地址*  返回值: 無*  時間  : 2024/7/13 *  作者  : _滄浪之水_************************************
**/
void Print(People_t  *p) 
{// 左邊的是結構體指針 “結構體指針->成員變量”printf("%s %s %s %d\n", p->name, p->tel, p->sex, p->high);
}

注:以上的這種寫法需要在主函數中進行調用


4.0: 結構體嵌套調用

#define  _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include <string.h>
#include "add.h"
#include <stdint.h>/**************************************  結構體: 創建結構體*  參數  : 結構體成員 char name[20]; char tel[12];*  返回值: 無*  時間  : 2024/7/13*  作者  : _滄浪之水_************************************ 
**/
typedef struct
{char name[20];char tel[12];char sex[5];int high;
}People_t;/**************************************  結構體: 創建結構體*  參數  : 結構體成員,內部包含結構體【順帶變量初始化,結構體初始化】*  返回值: 無*  時間  : 2024/7/13*  作者  : _滄浪之水_************************************
**/
typedef struct 
{People_t p;int num;float f;
}recallStruct_t;/**************************************  結構體: 結構體傳遞地址調用*  參數  : *p 指針地址*  返回值: 無*  時間  : 2024/7/13*  作者  : _滄浪之水_************************************
**/
void Print(People_t  *p) 
{// 左邊的是結構體指針 “結構體指針->成員變量”printf("%s %s %s %d\n", p->name, p->tel, p->sex, p->high);
}/**************************************  結構體: 結構體成員變量訪問*  參數  : 結構體成員訪問*  返回值: 無*  時間  : 2024/7/13*  作者  : _滄浪之水_************************************
**/
void PrintTwo(People_t input) 
{// 左邊的是結構體變量 “結構體變量.成員變量”printf("%s %s %s %d\n", input.name, input.tel, input.sex, input.high);
}int main()
{// peo 是結構體變量,結構體變量創建后才會開辟內存控制,結構體變量初始化People_t peo = { "張三","15863310892","男",181 };// 浮點數在內存中不能精確的存儲,結構體嵌套初始化recallStruct_t recal = { {"李四","15863310892","男",181},100, 88.8f };printf("%s %s %s %d\n", peo.name, peo.tel, peo.sex, peo.high);printf("%s %s %s %d %d %f\n", recal.p.name, recal.p.tel, recal.p.sex, recal.p.high, recal.num, recal.f);Print(&peo);PrintTwo(peo);return 0;
}

注:以上的注釋編寫方式僅限于更好的理解知識,實際的開發過程會更為規范,推薦書籍《高質量 C C++ 編程指南 》。

?注:上面的兩種打印輸出方式哪一種打印方式更好,結構體傳遞參數吧 “對象” 進行結構體傳參的時PrintTwo() 這種參數傳遞方式方式時PrintTwo(peo),peo實際是一個對象已經在內存中開辟了一塊內存空間,如果把對象作為實際參數傳遞給形參的時候“形參里面的內容實際上是實際參數的一份拷貝” 打印peo的時候打印輸出的數據是一樣的,空間和時間的浪費會降低程序的性能。【推薦使用地址傳遞的方式把參數的地址傳遞進去(地址的大小就是4-8字節)通過地址找到數據】參數傳遞的時候會壓棧結構體傳遞參數的時候盡量傳遞結構體的地址節省時間和空間


5.0 數組方式給結構體成員賦值

#define  _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include <string.h>
#include "add.h"
#include <stdint.h>#define MAX_LIST_NUM (sizeof(arrList) / sizeof(arrList[0]))/**************************************  結構體: 創建結構體*  參數  : 結構體成員 char name[20]; char tel[12];*  返回值: 無*  時間  : 2024/7/13*  作者  : _滄浪之水_************************************ 
**/
typedef struct
{char name[20];char tel[12];char sex[5];int high;
}People_t;static People_t arrList[] =
{{"Keil","122345625","男",180},{"Ling","122345625","女",185}
};int main()
{uint8_t i = 0;for (i = 0; i < MAX_LIST_NUM; i++) {printf("%s %s %s %d\n", arrList[i].name, arrList[i].tel, arrList[i].sex, arrList[i].high);}return 0;
}


?......

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

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

相關文章

解鎖音樂密碼,人工智能創作動人歌詞

在音樂的神秘世界里&#xff0c;每一段旋律都像是一把等待開啟的密碼鎖&#xff0c;隱藏著無盡的情感與故事。而如今&#xff0c;人工智能正以其獨特的智慧和創造力&#xff0c;幫助我們解鎖這些音樂密碼&#xff0c;創作出動人的歌詞。 “妙筆生詞智能寫歌詞軟件&#xff08;…

Provider(1)- 什么是AudioBufferProvider

什么是AudioBufferProvider&#xff1f; 顧名思義&#xff0c;Audio音頻數據緩沖提供&#xff0c;就是提供音頻數據的緩沖類&#xff0c;而且這個AudioBufferProvider派生出許多子類&#xff0c;每個子類有不同的用途&#xff0c;至關重要&#xff1b;那它在Android哪個地方使…

訪問 Postman OAuth 2.0 授權的最佳實踐

OAuth 2.0 代表了 web 安全協議的發展&#xff0c;便于在多個平臺上進行授權服務&#xff0c;同時避免暴露用戶憑據。它提供了一種安全的方式&#xff0c;讓用戶可以授權應用程序訪問服務。 在 Postman 中開始使用 OAuth 2.0 Postman 是一個流行的API客戶端&#xff0c;支持 …

亞馬遜店鋪注冊

**步驟一&#xff1a;準備注冊相關資料** 在注冊之前&#xff0c;請準備以下資料&#xff1a; 1.公司營業執照照片&#xff08;清晰完整的拍照上傳&#xff09; 2.法人身份證正反面照片&#xff08;清晰完整的拍照上傳&#xff09; 3.雙幣付款信用卡&#xff08;VISA&#xff0…

[PaddlePaddle飛槳] PaddleSpeech-自動語音識別-小模型部署

PaddleSpeech的GitHub項目地址 環境要求&#xff1a; gcc > 4.8.5 paddlepaddle < 2.5.1 python > 3.8 OS support: Linux(recommend), Windows, Mac OSXpip下載指令&#xff1a; python -m pip install paddlepaddle-gpu2.5.1 -i https://pypi.tuna.tsinghua.edu.c…

探索4D毫米波雷達和攝像頭在自動駕駛中的潛力

隨著自動駕駛技術的快速發展&#xff0c;關于各種傳感器的必要性&#xff0c;尤其是LiDAR&#xff08;激光雷達&#xff09;與毫米波雷達結合攝像頭的作用&#xff0c;激發了激烈的討論。在這篇博客中&#xff0c;我們將探討4D毫米波雷達和攝像頭的組合是否可能成為自動駕駛車輛…

將vue項目整合到springboot項目中并在阿里云上運行

第一步&#xff0c;使用springboot中的thymeleaf模板引擎 導入依賴 <!-- thymeleaf 模板 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> 在r…

聊聊接入Arbitrum的正確姿勢

本文首發于公眾號&#xff1a;Keegan小鋼 前言 我們知道&#xff0c;目前最主流的 Ethereum Layer2 方案中&#xff0c;主要有 Optimistic Rollup 和 ZK Rollup 兩大類。而 Optimistic Rollup 的實現方案中&#xff0c;則是 Optimism 和 Arbitrum 最受關注。而我們最近接入了 …

Java套紅:指定位置合并文檔-NiceXWPFDocument

需求&#xff1a;做個公文系統&#xff0c;需要將正文文檔在某個節點點擊套紅按鈕&#xff0c;實現文檔套紅 試了很多方法&#xff0c;大多數網上能查到但是實際代碼不能找到關鍵方法&#xff0c;可能是跟包的版本有關系&#xff0c;下面記錄能用的這個。 一&#xff1a;添加依…

redis-cli 連接Redis

Redis-cli介紹 redis-cli 是原生 Redis 自帶的命令行工具&#xff0c;您可以在云主機或本地設備上通過 redis-cli 連接 Redis 數據庫&#xff0c;進行數據管理。 redis-cli 客戶端的使用方法&#xff0c;請參考官方文檔。 連接命令 redis-cli -h <redis_instance_address…

一個極簡的 Vue 示例

https://andi.cn/page/621516.html

【qt】客戶端連接到服務器

獲取到IP地址和端口號. 通過connectToHost() 來進行連接. 對于客戶端來講,只需要socket即可. 客戶端連接服務端只需要使用套接字(Socket)來進行通信。客戶端通過創建一個套接字來連接服務端&#xff0c;然后可以通過套接字發送和接收數據。套接字提供了一種簡單而靈活的方式來…

接口安全配置

問題點&#xff1a; 有員工在工位在某個接口下鏈接一個集線器&#xff0c;從而擴展上網接口&#xff0c;這種行為在某些公司是被禁止的&#xff0c;那么網絡管理員如何控制呢&#xff1f;可以配置接口安全來限制鏈接的數量&#xff0c;切被加入安全的mac地址不會老化&#xff…

JS實現:統計字符出現頻率/計算文字在文本中的出現次數

要實現這個功能&#xff0c;JavaScript 一個非常強大的方法&#xff0c;那就是reduce() reduce() 它用于將數組的所有元素減少到一個單一的值。這個值可以是任何類型&#xff0c;包括但不限于數字、字符串、對象或數組。 reduce() 方法接收一個回調函數作為參數&#xff0c;這個…

win10 docker-compose搭建ELK日志收集

elk的威名大家都知道&#xff0c;以前前司有專門的人維護&#xff0c;現在換了環境&#xff0c;實在不想上服務器看&#xff0c;所以就摸索下自己搭建&#xff0c;由于現場服務器是需要類似向日葵那樣連接&#xff0c;我還是把日志弄回來&#xff0c;自己本地filebeat上傳到es中…

ESP32和ESP8266的WIFI的136個問題與答案

ESP32和ESP8266的WIFI的136個問題與答案 ESP32和ESP8266 WIFI相關問題與答案&#xff0c;具有一定的參考價值。ESP32-S3模塊 1. ESP32 和 ESP8266 是否支持中文 SSID&#xff1f; ESP32 和 ESP8266 均支持中文 SSID&#xff0c;但需要使用相應的庫和設置。需要注意的是&#…

自定義函數---隨機數系列函數

大家有沒有發現平常在寫隨機數的時候&#xff0c;需要引入很多的頭文件&#xff0c;然后還需要用一些復雜的函數&#xff0c;大家可能不太習慣&#xff0c;于是我就制作了一個頭文件 // random_number.h #ifndef RANDOM_NUMBER_H // 預處理指令&#xff0c;防止頭文件被重復包含…

六款領先的電腦監控軟件系統(哪些電腦軟件可以監控電腦)

在當今信息時代&#xff0c;企業對數據安全和員工生產力的關注度越來越高。電腦監控軟件系統成為企業管理的重要工具&#xff0c;幫助企業確保信息安全、提高工作效率。本文將介紹幾款領先的電腦監控軟件系統&#xff0c;以便企業選擇最適合的解決方案。固信電腦監控軟件 可免費…

如何在SQLServer中更改端口

在SQL Server中更改端口通常涉及SQL Server配置管理器的使用&#xff0c;以下是一個詳細的步驟指南&#xff1a; 一、打開SQL Server配置管理器 通過開始菜單&#xff1a;點擊“開始”菜單&#xff0c;搜索“SQL Server配置管理器”并打開它。通過運行窗口&#xff1a;按Win …

log4j2的日志框架(詳細,springboot和異步日志的實現)

目錄 log4j2的介紹 Log4j2的性能 SpringBoot中的使用Log4j2 log4j2的進階--異步日志 AsyncAppender方式 AsyncLogger方式 log4j2的介紹 Apache Log4j 2是對Log4j的升級版&#xff0c;參考了logback的一些優秀的設計&#xff0c;并且修復了一些問題&#xff0c;因此帶 來…