C++學習(二十五)(C語言部分)之 結構體2

来源:https://www.cnblogs.com/Yuuki-/archive/2019/03/26/10598158.html
-Advertisement-
Play Games

基本概述: int double char; 定義一個學生類型 int Student 姓名 性別 年齡 簡單地說 結構體是一個可以包含不同類型的結構,他是一個自定義的類型。 struct 結構體標識符{成員變數;}; struct 是系統關鍵字,用來說明當前定義了一個自定義類型 結構體標識符 為了 ...


基本概述:
int double char;
定義一個學生類型 int Student 姓名 性別 年齡
簡單地說 結構體是一個可以包含不同類型的結構,他是一個自定義的類型。

struct 結構體標識符{成員變數;};
struct 是系統關鍵字,用來說明當前定義了一個自定義類型
結構體標識符 為了遵循c標識符命名規則的一個標識符
//struct 2B{}; 該種命名方式是不可以的
成員變數列表 用於描述此類事物的某一方面的特性 變數可以為基本數據類型和史震類型,也可以是

結構體的對齊補齊的存儲方式 為了方便CPU讀取
1.第一個數據成員存儲在第0個位置
2.之後的每一個成員存儲的起始位置是要從該成員大小的整數倍開始存放
3.結構體的總大小,必須是其內部最大成員(成員中大小最大的那個的整數倍)的整數倍,不足就要不齊。

結構體大小比實際定義的大小要大

位域:用來節約記憶體 存儲少量信息

 

案例測試代碼如下:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<windows.h>
  4 
  5 #pragma warning(disable:4996)//解決在vs2013中strcpy出錯,原因是strcpy安全性太低 vs棄用了 改成了strcpy_s
  6 
  7 struct People
  8 {
  9     char name[20];
 10     char sex[5];
 11     int age;
 12 };  //結構體的聲明
 13     //  .c是c語言文件   .cpp是c++文件 在c++中結構體使用的時候是可以省去struct
 14 
 15 struct P
 16 {
 17     int a;
 18     double b;
 19     char c;
 20 }pe,*ppe;
 21 //typedef  用來給數據類型起別名
 22 //pe --->struct p
 23 //*ppe   ----->struct p*
 24 
 25 //typedef int[5] INT_ARR_5; //定義一個數組的別名  該種定義的方式是錯誤的
 26 //typedef int INT_ARR_5[5];//要這樣定義
 27 
 28 typedef int INT_ARR_5 [2];
 29 typedef int(*p)(int, int);  //函數指針的別名,名字就是p int(*)(int,int);是一個函數指針
 30 typedef int(*pArr)[5];
 31 
 32 int MySwap(int a, int b)
 33 {
 34     printf("交換函數:\n");
 35     return 0;
 36 }
 37 
 38 struct LvLiYu  //位域 為了節省記憶體空間 用多少給多少
 39 {
 40     int a : 1; //4位元組 32位  只拿了32位(包括符號位的)中的一位用來存儲a  二進位位
 41     int b : 8;//8位
 42     int c : 10;//10位
 43     int d : 5;//5位
 44     int e : 1;//1位    都是按位存儲  
 45 };
 46 
 47 
 48 int main()
 49 {
 50 #if 0
 51     struct People PangQi;  //定義了一個自定義的變數 PangQi
 52     PangQi.age = 20;
 53     //PangQi.name = pangqi;  //該種描述的方式是錯誤的  原因是數組名是一個地址,所以用一個常量來等於一個地址是錯誤的
 54     //所以要用字元串拷貝函數
 55     strcpy_s(PangQi.sex, "");
 56     strcpy_s(PangQi.name, "艾迪");
 57     printf("姓名:%s\t性別:%s\t年齡:%d\t\n", PangQi.name, PangQi.sex, PangQi.age);
 58 #endif
 59 
 60 #if 0
 61     //該案例存在緩衝區殘留寫入的bug,在輸入年齡的時候如果字元過長會直接跳過第二個學生的姓名輸入
 62     //解決方法  在數據輸入迴圈中加入一句清空緩存取得命令  fflush(stdin);
 63     struct People Student[3];
 64     for (int i = 0; i < 3; i++)
 65     {
 66         printf("請輸入第%d個同學的姓名:",i+1);
 67         scanf("%s", Student[i].name);
 68 
 69         printf("請輸入第%d個同學的性別:", i + 1);
 70         scanf("%s", Student[i].sex);
 71 
 72         printf("請輸入第%d個同學的年齡:", i + 1);
 73         scanf("%d", &Student[i].age);
 74 
 75         fflush(stdin);  //清空輸入流緩衝區
 76     }
 77     printf("姓名\t\t性別\t\t年齡\t\t\n");
 78     for (int i = 0; i < 3; i++)
 79     {
 80         printf("%s\t\t%s\t\t%d\n", Student[i].name,Student[i].sex,Student[i].age);
 81     }
 82     
 83 #endif
 84 
 85 //    printf("%d",sizeof(struct P));//結構體的對齊與補齊
 86 
 87     //typedef int age;
 88    // age age= 58;//別名
 89 
 90 #if 0
 91     INT_ARR_5 a;
 92     for (int i = 0; i < 5; i++)
 93     {
 94         a[i] = i + 1;  //這裡說明a是一個數組 應為我們在前面定義了提個int型的數組別名INT_ARR_5
 95     }
 96     int b;//這裡我們定義b是一個整型變數 並不是一個數組
 97     b[0];//所以此處會顯示錯誤
 98 #endif
 99 
100 #if 0
101     INT_ARR_5 a[3];  //這種形式就表示一個二維數組 等價於int a[3][5]
102     for (int i; i < 3; i++)
103     {
104         for (int j; j < 5; j++)
105         {
106             scanf("%d",&a[i][j]);
107         }
108     }
109 #endif
110 
111 #if 0
112     p Yu; //定義函數指針的變數
113     Yu = MySwap;  //函數指針的變數保存函數地址
114     Yu(1, 2);
115 #endif
116 
117 #if 0
118     int Arr[3][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
119     pArr p;
120     p = Arr;  //p 指向Arr[0]  p+1指向Arr[1]
121     printf("%d", **(p + 1));
122 #endif
123 
124 #if 0
125     printf("%d\n", sizeof(struct LvLiYu));
126     struct LvLiYu HongLiYu;
127     HongLiYu.a = 1;
128     printf("%d\n", HongLiYu.a);
129 #endif
130 
131     getchar();
132     return 0;
133 }

 

註:在代碼中的#if 1/0 #endif 是預編譯部分,可以用來當做註釋 

 

2019-03-26  09:23:34


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 刪除array數組中的某個元素,首先需要確定需要刪除元素的索引值。 ? 1 2 3 4 5 6 7 var arr=[1,5,6,12,453,324]; function indexOf(val){ for(var i = 0; i < arr.length; i++){ if(arr[i] == ...
  • Array數組是Javascript構成的一個重要的部分,它可以用來存儲字元串、對象、函數、Number,它是非常強大的。因此深入瞭解Array是前端必修的功課。本文將給大家詳細介紹了javascript中數組的常用演算法,下麵話不多說了,來一起看看詳細的介紹吧 一、jQuery插件不改變原數組,返回 ...
  • JavaScript是運行在客戶端的腳本,因此一般是不能夠設置Session的,因為Session是運行在伺服器端的。 而cookie是運行在客戶端的,所以可以用JS來設置cookie. 假設有這樣一種情況,在某個用例流程中,由A頁面跳至B頁面,若在A頁面中採用JS用變數temp保存了某一變數的值, ...
  • 使用 substring()或者slice() 函數:split() 功能:使用一個指定的分隔符把一個字元串分割存儲到數組 例子: str=”jpg|bmp|gif|ico|png”; arr=theString.split(”|”); //arr是一個包含字元值”jpg”、”bmp”、”gif”、 ...
  • 過濾器: vue提供過濾器: capitalize uppercase currency.... ? 1 2 3 <div id="box"> {{msg|currency ¥}} </div> ? 1 2 3 <div id="box"> {{msg|currency ¥}} </div> ? 1 ...
  • 一、設置定時器 window對象提供了兩個方法來實現定時器的效果, 分別是window.setTimeout()和window.setInterval。其中前者可以使一段代碼在指定時間後運行;而後者則可以使一段代碼每過指定時間就運行一次。它們的原型如下: window.setTimeout(code ...
  • 在Java中,static可以用來修飾成員變數和成員方法。 修飾成員變數,稱為靜態成員方法 修飾靜態方法,稱為靜態成員方法 搞清楚用法和區別之前,先搞清static聲明的變數和普通非靜態變數在記憶體的分佈是怎樣的,這樣的話,理解起來會事半功倍的。 代碼測試如下: 運行結果: 張三 王隔壁 在記憶體的結果 ...
  • 一、程式設計思路 在我的三次作業中都採用了類的分層結構,採用逐項匹配,分層求導的思路。 (一)、 第一次作業中構建了Polynimial(多項式)類,在類的構造器中就完成了對非法空格的判斷並對合法表達式進行刪除空格處理。由於第一次作業僅含有帶有繫數的冪函數與常數項,因而我就沒有專門構建針對每一個項的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...