C語言基礎系列【27】typedef

博主介紹:程序喵大人

  • 35- 資深C/C++/Rust/Android/iOS客戶端開發
  • 10年大廠工作經驗
  • 嵌入式/人工智能/自動駕駛/音視頻/游戲開發入門級選手
  • 《C++20高級編程》《C++23高級編程》等多本書籍著譯者
  • 更多原創精品文章,首發gzh,見文末
  • 👇👇記得訂閱專欄,以防走丟👇👇
    😉C++基礎系列專欄
    😃C語言基礎系列專欄
    🤣C++大佬養成攻略專欄
    🤓C++訓練營
    你的專屬C++編程指南 👉🏻https://chengxumiaodaren.com/

在C語言編程中,typedef關鍵字很強大又好用,下面詳細介紹。

基本概念

typedef是C語言中的一個關鍵字,它的作用是給數據類型起一個新的名字。這個新的名字在代碼中可以像原始類型一樣使用,但代碼更加直觀和易于理解。

typedef通常用于簡化復雜的數據類型聲明,尤其是在處理結構體、聯合體、函數指針等復雜類型時。

例如,unsigned char類型可以用來表示一個字節的數據,但在代碼中頻繁使用unsigned char可能會降低可讀性。此時,可以使用typedef為它定義一個更直觀的名字,如BYTE

typedef unsigned char BYTE;
BYTE b1, b2; // 等價于 unsigned char b1, b2;

基本數據類型中的應用

除了為字符類型定義別名外,typedef還可以用于整型、浮點型等基本數據類型。例如:

typedef int INT32; // 定義32位整數類型(盡管在大多數現代平臺上int可能是32位或64位,這里僅作為示例)
typedef float FLOAT32; // 定義32位浮點數類型
typedef double DOUBLE64; // 定義64位雙精度浮點數類型INT32 a = 100;
FLOAT32 b = 3.14f;
DOUBLE64 c = 9.81;

通過這種方式,代碼中的數據類型聲明變得更加清晰。

結構體中的應用

使用typedef可以為結構體定義一個新的類型名稱,從而簡化結構體的聲明和使用。

例如,定義一個表示書籍信息的結構體:

#include <stdio.h>
#include <string.h>typedef struct {
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;int main() {Book book;strcpy(book.title, "C Programming Language");strcpy(book.author, "Brian W. Kernighan");strcpy(book.subject, "Computer Science");book.book_id = 12345;printf("Book Title: %s\n", book.title);printf("Book Author: %s\n", book.author);printf("Book Subject: %s\n", book.subject);printf("Book ID: %d\n", book.book_id);return 0;
}

在這個例子中,typedef使我們可以直接使用Book類型來聲明變量,而不需要每次都寫出完整的struct定義。這不僅節省了代碼空間,還提高了代碼的可讀性。

指針類型中的應用

在處理指針類型時,typedef同樣非常有用。特別是當指針指向復雜的數據結構(如結構體或聯合體)時,使用typedef可以大大簡化指針的聲明和使用。

例如,定義一個指向Book結構體的指針類型:

typedef Book* BookPtr;int main() {BookPtr myBook = (BookPtr)malloc(sizeof(Book)); // 動態分配內存if (myBook != NULL) {strcpy(myBook->title, "The C Programming Language");strcpy(myBook->author, "Dennis M. Ritchie");strcpy(myBook->subject, "Programming");myBook->book_id = 54321;// 打印書籍信息(省略)free(myBook); // 釋放內存}return 0;
}

在這個例子中,typedef使我們可以使用BookPtr類型來聲明指向Book結構體的指針變量,而不需要每次都寫出Book*,稍微簡化了一點代碼。

函數指針中的應用

使用我在前面就簡單介紹過,typedef可以大大簡化函數指針的聲明和使用。

例如,定義一個指向返回整型值、接受兩個整型參數的函數的指針類型:

typedef int (*FuncPtr)(int, int);int add(int a, int b) {return a + b;
}int main() {FuncPtr myFunc = add; // 將函數add的地址賦給函數指針myFuncint result = myFunc(3, 4); // 調用函數指針指向的函數printf("Result: %d\n", result); // 輸出結果return 0;
}

在這個例子中,typedef使得我們可以使用FuncPtr類型來聲明函數指針變量,而不需要每次都寫出復雜的函數指針聲明語法。這不僅簡化了代碼,還提高了代碼的可讀性。

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

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

相關文章

【CXX-Qt】2.5 繼承

某些 Qt API 要求你從抽象基類中重寫某些方法&#xff0c;例如 QAbstractItemModel。 為了支持直接從 Rust 中創建這樣的子類&#xff0c;CXX-Qt 提供了多種輔助工具。 某些基類可能需要特殊的構造參數。這可以通過使用自定義構造函數來實現。 訪問基類方法 要在 Rust 中訪…

磁盤清理工具-TreeSize Free介紹

TreeSizeFree是一個磁盤空間管理工具&#xff0c;主要用于分析磁盤使用情況&#xff0c;幫助用戶找到占用空間大的文件和文件夾: 特點&#xff1a;按大小排序&#xff1a;快速找到占用空間最大的文件或文件夾 一般可以刪除: 掃描 C:\Users\XXX\AppData\Local\Temp 或 C:\Window…

OpenCV中距離公式

一、各類距離公式總結 常見距離公式 歐氏距離&#xff1a; 曼哈頓距離&#xff08;L1&#xff09;?&#xff1a; 切比雪夫距離&#xff08;Chessboard&#xff09;?&#xff1a; 1、點與點距離(歐氏距離) ?二維空間? 設兩點坐標為 P1(x1,y1)、P2(x2,y2)&#xff0c;其距離…

Vue.js 模板語法全解析:從基礎到實戰應用

引言 在 Vue.js 的開發體系中&#xff0c;模板語法是構建用戶界面的核心要素&#xff0c;它讓開發者能夠高效地將數據與 DOM 進行綁定&#xff0c;實現動態交互效果。通過對《Vue.js 快速入門實戰》中關于 Vue 項目部署章節&#xff08;實際圍繞 Vue 模板語法展開&#xff09;…

論文筆記(七十三)Gemini Robotics: Bringing AI into the Physical World

Gemini Robotics: Bringing AI into the Physical World 文章概括1. 引言2. Gemini 2.0的具身推理2.1. 具身推理問答&#xff08;ERQA&#xff09;基準測試2.2. Gemini 2.0的具身推理能力2.3. Gemini 2.0支持零樣本和少樣本機器人控制 3. 使用 Gemini Robotics 執行機器人動作3…

centos7搭建postgresql12主從

主從搭建 192.168.159.101 node1 主庫&#xff08;讀寫&#xff09; 192.168.159.102 node2 備庫&#xff08;只讀&#xff09; 兩臺機器首先安裝postgrsql 主庫 postgres用戶操作&#xff1a; 修改postgresql.conf # 在文件中修改(此配置僅用于遠程訪問, 流復制后續還有額外…

嵌入式基礎知識學習:SPI通信協議是什么?

SPI&#xff08;Serial Peripheral Interface&#xff09;是串行外設接口的縮寫&#xff0c;是一種廣泛應用于嵌入式系統的高速同步串行通信協議&#xff0c;由摩托羅拉公司于20世紀80年代提出。以下是其核心要點&#xff1a; 一、SPI的核心定義與特點 基本特性 全雙工同步通信…

996引擎-接口測試:背包

996引擎-接口測試:背包 背包測試NPC參考資料背包測試NPC CONSTANT = require("Envir/QuestDiary/constant/CONSTANT.lua"); MsgUtil = require("Envir/QuestDiary/utils/996/MsgUtil.lua");

vulnhub靶場之【hack-me-please靶機】

前言 靶機&#xff1a;billu_b0x2靶機&#xff0c;IP地址為192.168.10.8 攻擊&#xff1a;kali&#xff0c;IP地址為192.168.10.6 靶機和攻擊機都采用VMware虛擬機&#xff0c;都采用橋接網卡模式 文章涉及的靶機及工具&#xff0c;都可以自行訪問官網或者項目地址進行獲取&…

機器學習——KNN模型評價

一、主要函數 sklearn.metrics.accuracy_score() 是 scikit-learn 中用于計算分類模型準確率的函數&#xff0c;適用于評估分類任務的整體性能。 1、核心功能 作用&#xff1a;計算模型預測的準確率&#xff0c;即正確分類的樣本數占總樣本數的比例。公式&#xff1a;Accurac…

美國國家數據浮標中心(NDBC)

No.大劍師精品GIS教程推薦0地圖渲染基礎- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入門教程】 - 【源代碼示例 300】 2Leaflet 【入門教程】 - 【源代碼圖文示例 150】 3MapboxGL【入門教程】 - 【源代碼圖文示例150】 4Cesium 【入門教程】…

Qt調用Miniconda的python方法

1、 Win 64環境下載及安裝 Miniconda 首先下載Windows 版Miniconda&#xff0c;https://docs.conda.io/en/latest/miniconda.html或 https://repo.anaconda.com/miniconda/ 安裝界面及選擇如下圖所示&#xff1a; 安裝完python3.12版報錯如下。 說明&#xff1a;python3.11版…

Unity 與 JavaScript 的通信交互:實現跨平臺的雙向通信

前言 在現代游戲開發和 Web 應用中&#xff0c;Unity 和 JavaScript 的結合越來越常見。Unity 是一個強大的跨平臺游戲引擎&#xff0c;而 JavaScript 是 Web 開發的核心技術之一。通過 Unity 和 JavaScript 的通信交互&#xff0c;開發者可以實現從 Unity 到 Web 頁面的功能擴…

汽車免拆診斷案例 | 2024 款路虎發現運動版車無法正常識別智能鑰匙

故障現象  一輛2024款路虎發現運動版車&#xff0c;搭載2.0 L發動機&#xff0c;累計行駛里程約為5 000 km。車主反映&#xff0c;使用遙控器無法解鎖車門&#xff0c;隨后使用機械鑰匙打開車門&#xff0c;踩下制動踏板&#xff0c;按壓起動按鈕&#xff0c;儀表盤提示“將智…

跟著StatQuest學知識06-CNN進行圖像分類

目錄 一、CNN特點 二、CNN應用于圖像分類 &#xff08;一&#xff09;使用過濾器 &#xff08;二&#xff09;通過ReLU激活函數 &#xff08;三&#xff09;應用新的濾波器&#xff08;池化&#xff09; &#xff08;四&#xff09;輸入 &#xff08;五&#xff09;輸出…

OpenHarmony 開源鴻蒙北向開發——linux使用make交叉編譯第三方庫

這幾天搞鴻蒙&#xff0c;需要編譯一些第三方庫到鴻蒙系統使用。 頭疼死了&#xff0c;搞了一個多星期總算搞定了。 開貼記坑。 一、SDK下載 1.下載 在linux下使用命令 wget https://cidownload.openharmony.cn/version/Master_Version/OpenHarmony_5.1.0.54/20250313_02…

Selenium Web UI自動化測試:從入門到實戰

引言 在當今快速迭代的軟件開發周期中&#xff0c;自動化測試已成為保障產品質量、提升測試效率的核心手段之一。而針對Web應用的UI自動化測試&#xff0c;Selenium作為最流行的開源工具之一&#xff0c;憑借其跨瀏覽器、多語言支持&#xff08;Python、Java、C#等&#xff09…

Java 大視界 -- Java 大數據中的數據隱私保護技術在多方數據協作中的應用(147)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

編程考古-安德斯·海爾斯伯格(Anders Hejlsberg)回答離開Borland的原因

安德斯海爾斯伯格&#xff08;Anders Hejlsberg&#xff09;是著名的編程語言和工具開發者&#xff0c;曾主導開發了 Turbo Pascal、Delphi&#xff08;Borland 時期&#xff09;&#xff0c;以及加入微軟后參與的 C# 和 TypeScript。關于他離開 Borland 的原因&#xff0c;可以…

西門子仿真實例位置

C:\Users\san\Documents\Siemens\Simatic\Simulation\Runtime\Persistence S7-PLCSIM Advanced V3.0 可以打開文件&#xff0c;刪除重建