小杰學C(eleven day)——莫道浮云終蔽日,總有云開霧散時。

1.結構體

(1)內容

定義:

1.用戶自定義的數據類型

2.可以包含若干不同數據類型可相同)的成員變量

3.這些數據項組合起來反應某一信息

格式:

struct 結構體名 (用戶自定義的數據類型)

{

????????數據類型 成員變量1;

????????數據類型 成員變量2;

????????數據類型 成員變量3;

????????...

};

(2)結構體變量

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

格式:

struct 結構體 變量名

定義方式:

①先定義結構體類型,再定義其變量

struct 結構體名

{

????????成員變量;

};

struct 結構體名 變量名;

②定義結構體同時,定義結構體變量

③缺省結構體名定義結構體變量

(3)賦值

① 定義變量的同時直接大括號賦值 (初始化)

②定義變量時未初始化,然后對成員變量單獨賦值

③點等法賦值

(4)訪問

通過 .訪問:結構體變量名.成員變量名

scanf("%s %d %d %d", stu.name, &stu.id, &stu.score, &stu.age);

printf("%s %d %d %d\n", stu.name, stu.id, stu.score, stu.age);

(5)重定義 typedef

對變量進行重命名

typedef int int _num;

int == int_num

int a; == int_num a;

對指針地址進行重命名

typedef int * int _p

int * == int_p

int *p = &a; == int _p p = &a;

① 定義結構體的同時重定義

typedef struct student

{

????????int id;

????????int score;

} STU; // STU是結構體類型重定義的名字

struct student stu; == STU stu;

② 先定義結構體,然后重定義

struct student

{

????????int id;

????????int age;

};

typedef struct student STU;

2.結構體數組

(結構體相類型變量組成的數組)

(1)格式

① 定義結構體的同時定義結構體數組

②先定義結構體,然后定義結構體數組

struct student
{char name[32];int id;int score;int age;
};struct student stu[3];

(2)賦值:

????????① 定義結構體數組的同時賦值

????????②先定義結構體數組。再對結構體數組的每一個人元素分別賦值

(3)結構體數組的輸入輸出:(for循環遍歷)

#include <stdio.h>
#include <string.h>struct student
{char name[32];int id;int score;int age;
};int main(int argc, char const *argv[])
{struct student stu[3];for(int i = 0; i < 3; i++){scanf() \ printf();}return 0;
}

(4)結構體數組的大小

????????sizeof(結構體數組名);

????????元素個數 * 結構體類型大小

3.結構體指針

(指向結構體的指針)

(1)格式:

????????存儲類型 數據類型 *指針變量名

????????struct 結構體名 *結構體指針變量名

(2)賦值:

????????格式:結構體指針變量 -> 成員變量

????????-> 指向的

#include <stdio.h>
#include <string.h>struct student
{int id;int age;
} stu;struct work
{int id;int score;
} w;int main(int argc, char const *argv[])
{struct student *p1 = &stu;
    p1->id = 1;
    p1->age = 18;printf("%d %d\n", stu.id, stu.age);return 0;
}

(*p1).成員變量

練習:

????????創建一個結構體數組,數組名為student,成員包含學號,姓名,成績(數據類型自己設定)從終端輸入學生信息,封裝函數實現按成績從低到高打印學生信息。

#include <stdio.h>
#include <string.h>#define N 3struct student
{int id;char name[32];int score;
};void fun(struct student *p)
{struct student temp;for(int i = 0; i < N-1; i++){for(int j = 0; j < N-1-i; j++){if((p+j)->score > (p+j+1)->score){
                temp = *(p+j);*(p+j) = *(p+j+1);*(p+j+1) = temp;}// if(p[j].score > p[j+1].score)// {//     temp = p[j];//     p[j] = p[j+1];//     p[j+1] = temp;// }}}for(int i = 0; i < N; i++)//printf("%d %s %d\n", p[i].id, p[i].name, p[i].score);printf("%d %s %d\n", (p+i)->id, (p+i)->name, (p+i)->score);
}int main(int argc, char const *argv[])
{struct student stu[N];for (int i = 0; i < N; i++)scanf("%d %s %d", &stu[i].id, stu[i].name, &stu[i].score);fun(stu);return 0;
}

(2)結構體大小

sizeof(struct 結構體名) // 結構體類型大小

struct student
{char a;short w;char y;int b;char c;
} stu;

結構體大小遵循字節對齊原則

? ? ? ? 1.字節對齊:

在實際使用中,訪問特定數據類型變量時需要在特定的內存起始地址進行訪問,這就需要各種數據類型按照一定的規則在空間上進行排列,而不是順序地一個接一個地存放,這就是字節對齊

????????2.字節對齊原則:

  1. 在64位系統下默認的value值為8字節,判斷結構體類型中最大成員變量的字節大小,和默認的value值進行比較,按小的數進行對齊
  2. 結構體成員進行對齊時遵循地址偏移量是成員類型的整數倍
  3. 結構體成員按順序進行存儲,如果不滿足以上條件時,需要填充空字節

? ? ? ? 3.進行字節對齊的原因:

  1. 平臺原因:不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。(提高程序的移植性)
  2. 性能原因:數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。
  3. 內存原因:在設計結構體時,通過對齊規則盡可能優化結構體的空間大小至最小空間

例子:

struct student
{char a;short w;char y;int b;char c;
} stu;  // 大小 16

第一步:找出成員變量的大小,讓其與編譯器的默認的對齊數進行比較,取較小的值作為該成員變量的對齊數

第二步:根據每個成員對應的對齊數畫出他們在內存中的相對位置

第三步:計算結構體大小

4.枚舉

維基百科的理解:枚舉類型用于聲明一組命名的常數,當一個變量有幾種可能的取值時,可以將它定義為枚舉類型。 定義:是指將變量的值一一列出來,變量的值只限于列舉出來的值的范圍內。

我的理解:枚舉類型就是將一些比較固定的值一一列舉出來,枚舉類型和宏定義是差不多的,只有細微區別,宏運行是在預處理階段完成的,枚舉類型是在與編譯階段完成的。

定義:

用戶自定義數據類型,用于聲明一組常數

格式:

enum 枚舉名

{

????????value1,

????????value2,

????????value3

????????...

};

未賦初值時,第一個常數默認是0,后續的常數依次加一(如果第一個值賦值為1,從賦值的1開始遞增)

#include <stdio.h>
#include <string.h>
enum week
{
    MON = 1,
    TUE,
    WED,
    Thurs,
    Fri
};
int main(int argc, char const *argv[])
{int day;scanf("%d", &day);switch (day){case MON: printf("Monday"); break;case TUE:printf("Tuesday"); break;case WED:printf("Wednesday"); break;case Thurs:printf("Thursday"); break;case Fri:printf("Friday"); break;default:break;}return 0;
}

5.共用體

不同類型的成員變量共用同一塊地址空間

格式:

union 共用體名

{

????????成員列表;

}

(1)定義共用體變量

union 共用體名 變量名;

#include <stdio.h>
#include <string.h>union val
{int a;char ch;
} v;int main(int argc, char const *argv[])
{
    v.a = 10;// 他倆不能同時出現,是以最后一次賦值為準
    v.ch = 'a';printf("%d\n", v.a);return 0;
}

(2)特性:

  1. 共用體成員共用同一塊地址空間
  2. 賦值順序以最后一次為準
  3. 共用體大小為成員中類型最大的數據的大小

(3)使用共用體測試大小端

#include <stdio.h>
#include <string.h>union val
{int num;char ch;
} v;int main(int argc, char const *argv[])
{
    v.num = 0x12345678;if(v.ch == 0x78){printf("小端\n");}else{printf("大端\n");}return 0;
}

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

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

相關文章

海豚遠程控制APP:隨時隨地,輕松掌控手機

在快節奏的現代生活中&#xff0c;我們常常需要在不同設備之間切換&#xff0c;管理手機也變得越來越重要。無論是遠程辦公、遠程學習還是日常生活中對手機的管理&#xff0c;一款高效、便捷的遠程控制軟件都能極大地提升我們的效率。海豚遠程控制APP正是這樣一款功能強大的手機…

Linux/Ubuntu安裝go

Linux/Ubuntu安裝go1. 首先移除舊版本&#xff08;如有&#xff09;&#xff1a;2. 下載Go 1.23.9安裝包&#xff1a;3. 解壓到系統目錄&#xff1a;4. 設置環境變量&#xff08;添加到~/.profile或~/.bashrc文件末尾&#xff09;&#xff1a;5.使環境變量生效&#xff1a;6. 驗…

教程:如何快速查詢 A 股實時 K線和5檔盤口

實時行情數據是量化交易策略、看板系統和交易決策系統的重要輸入。本文將以 Infoway API 提供的 WebSocket API 為例&#xff0c;教你如何使用 Python 快速接入并獲取 A 股的實時 K線數據 和 盤口數據。一、準備工作安裝 WebSocket 庫&#xff1a;pip install websockets二、查…

施易德門店管理系統應用案例分析:零售女裝品牌伊芙麗的全球化布局

在零售品牌的全球化進程中&#xff0c;如何應對不同市場的合規要求、實現本地化精細化運營&#xff0c;是企業面臨的重要課題。施易德&#xff08;Cegid&#xff09;門店管理系統憑借40年的全球零售數字化服務經驗&#xff0c;為多個品牌的海外拓展提供了支持。其中&#xff0c…

安全初級作業2

一、作業要求 1、xss-labs 1~8關 2、python實現自動化sql布爾育注代碼優化(二分查找) 二、操作過程 &#xff08;一&#xff09;xss-labs 1~8關 1、前期準備 &#xff08;1&#xff09;打開小皮面板&#xff0c;并啟動Apache和MySQL &#xff08;2&#xff09;將 xss-labs…

多模態大語言模型arxiv論文略讀(157)

Automatic Evaluation for Text-to-image Generation: Task-decomposed Framework, Distilled Training, and Meta-evaluation Benchmark ?? 論文標題&#xff1a;Automatic Evaluation for Text-to-image Generation: Task-decomposed Framework, Distilled Training, and M…

面試150——數組字符串

88. 合并兩個有序數組 給你兩個按 非遞減順序 排列的整數數組 nums1 和 nums2&#xff0c;另有兩個整數 m 和 n &#xff0c;分別表示 nums1 和 nums2 中的元素數目。請你 合并 nums2 到 nums1 中&#xff0c;使合并后的數組同樣按 非遞減順序 排列。倒序比較&#xff0c;避免覆…

深入理解設計模式:命令模式詳解

在軟件開發中&#xff0c;我們經常遇到需要將"請求"或"操作"封裝成對象的情況。比如&#xff0c;GUI中的按鈕點擊、遙控器控制家電、事務系統中的操作回滾等場景。命令模式&#xff08;Command Pattern&#xff09;正是為解決這類問題而生的設計模式。本文…

自己寫的 MyHttpServlet 和直接繼承 HttpServlet 的區別

繼承你自己寫的 MyHttpServlet 和直接繼承 HttpServlet 的區別如下&#xff1a;1. 繼承 HttpServlet&#xff08;官方推薦用法&#xff09;HttpServlet 是 Java EE 官方提供的 Servlet 基類&#xff0c;已經實現了 Servlet 接口的大部分方法。它內部已經實現了 service() 方法&…

python庫 maya 庫的各種案例的使用詳解(人性化的日期時間處理)

文章目錄 一、Maya庫概述 1.1 maya介紹 1.2 安裝 maya 1.3 注意事項 二、基本使用 2.1 創建 MayaDT 對象 2.2 格式化輸出 2.3 時間運算 三、高級使用 3.1 時區處理 3.2 時間間隔 3.3 網絡時間獲取 四、實際應用示例 4.1 日志時間處理 4.2 會議時間提醒 4.3 國際化時間顯示 5. M…

企業選擇大帶寬服務器租用的原因有哪些?

大帶寬服務器作為各個行業使用較多的服務器類型&#xff0c;可以為企業提供更高的數據傳輸速率&#xff0c;極大縮短文件上傳與下載時間&#xff0c;對于大型文件&#xff0c;大帶寬服務器能夠將時間大幅縮減至數分鐘或數小時&#xff0c;提高企業整體的工作效率。大帶寬服務器…

使用canal同步分庫分表數據,到 Elasticsearch

作者&#xff1a;小凱 沉淀、分享、成長&#xff0c;讓自己和他人都能有所收獲&#xff01; 本文的宗旨在于通過簡單干凈實踐的方式教會讀者&#xff0c;配置出一套 Canal 工具服務&#xff0c;來同步分庫分表的數據到 Elasticsearch 文件夾系統中。同時在 SpringBoot 工程中&a…

氣候為何愈演愈“炙” — 未來五年高溫趨勢與 AI 氣象大模型的突破性價值

早、更準 代表性模型 主要特征 應用進展 GraphCast(DeepMind) 10 天全球預報;0.25 分辨率;< 1 min 推理 90 % 指標超 ECMWF HRES,已用于極端風暴提前鎖定Google DeepMind MetNet-3(Google Research) 1–4 km 分辨率;2 min 時序;24 h 區域精細預報 美東、歐洲已在 G…

LVS四種模式及部署NAT、DR模式集群

1、lvs簡介LVS:Linux Virtual Server&#xff0c;負載調度器&#xff0c;內核集成&#xff0c;章文嵩&#xff0c;阿里四層SLB(ServerLoadBalance)是基于LVSkeepalived實現LVS 官網: http://www.linuxvirtualserver.org/LVS 相關術語VS: Virtual Server&#xff0c;負責調度RS:…

【Linux】Ubuntu22.04安裝zabbix

官方文檔&#xff1a;zabbix安裝文檔 環境如下 環境版本nginx1.26.3zabbix7.0.16mysql8.0.41 安裝nginx和mysql 一鍵部署腳本 部署zabbix #!/bin/bash wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0ubuntu22.04_…

C++ - 仿 RabbitMQ 實現消息隊列--sqlite與gtest快速上手

目錄 SQLite 什么是 SQLite 為什么要用 SQLite SQLite3 C/C API 介紹 SQLite3 C/C API 使用 GTest GTest 是什么 GTest 使用 TEST 宏 斷言 事件機制 全局事件 TestSuite 事件 SQLite 什么是 SQLite SQLite 是一個進程內的輕量級數據庫&#xff0c;它實現了自給自足…

Web3.0 學習方案

Web3.0 學習方案 一、學習方案 &#xff08;一&#xff09;入門階段 1. 了解 Web3.0 基礎概念 學習內容&#xff1a; Web3.0 的起源、愿景、與 Web2.0 的區別區塊鏈的基本概念&#xff1a;分布式賬本、哈希、公鑰/私鑰、共識機制&#xff08;PoW、PoS、DPoS、PBFT 等&#xff0…

springboot3.5.3依賴學習

springboot3.5.3依賴學習 ? Spring Boot BOM&#xff08;spring-boot-dependencies&#xff09;是 Spring 官方維護的超級依賴清單&#xff0c;覆蓋了 Spring 生態中幾乎所有核心庫、常用工具庫及第三方依賴。其作用是統一管理這些依賴的版本&#xff0c;確保它們相互兼容。以…

制作一款打飛機游戲80:道具碰撞

目前我們仍然無法拾取這些物品&#xff0c;它們只是簡單地掉落在地上。因此&#xff0c;我們需要對這些功能進行增強。目標?彈射物品?&#xff1a;當物品生成時&#xff0c;我們希望它們能以一定的力量彈出&#xff0c;而不是無力地掉落。?添加不同類型的物品?&#xff1a;…

Python編程基礎(六)| 用戶輸入和while循環

引言 很久沒有寫 Python 了&#xff0c;有一點生疏。這是學習《Python 編程&#xff1a;從入門到實踐&#xff08;第3版&#xff09;》的課后練習記錄&#xff0c;主要目的是快速回顧基礎知識。 練習1&#xff1a;汽車租賃 編寫一個程序&#xff0c;詢問用戶要租什么樣的汽車&a…