在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言結構體的詳細資料介紹

Wildesbeast ? 來源:今日頭條 ? 作者:嵌入式筆記v ? 2020-04-12 12:01 ? 次閱讀

引言

不管什么樣的編程語言,數據類型的不斷衍生都是為了不同場合對其進行不同處理或管理。 比如單一的變量,我們可以定義成char, short,,int,float, double等;而如果需要管理多個同一類型的數據就可以使用數組來統一管理;那么如果是不同的數據類型,但是彼此是相關聯的呢? 此時就可以使用結構體來統一管理,這也是面對對象的基本思想。比如一個學生,他有如下信息: 名字(char *), 年齡(uint8), 成績(float)等。今天我們就來說說結構體的基本使用,后續再深入研究。

結構體的定義

使用struct關鍵字定義原生結構體類型

struct people{ char name[20]; int age;};

使用typedef類型自定義結構體類型

typedef struct people1{ char name[20]; int age; }people1_t;

兩種方式的有何不同呢? 第一種屬于原生結構體類型,在定義變量之前,都需要加上struct people

struct people p1;

而第二種使用typedef關鍵字自定義了people_t類型(people1_t等同于struct people1), 即在定義變量時,只需要在變量之前寫上people_t即刻。

people1_t p2;

這兩種方式都可,用戶根據自己的習慣選擇其中一種即刻,個人推薦第二種,定義比較方便~

定義結構體變量和初始化

如上所述,使用第一種struct people定義結構體變量時,有如下方式:

struct people{ char name[20]; int age;};int main(void){ struct people p1; //使用struct people定義變量p1 return 0;}

或:

//定義類型的同時定義變量struct student{ char name[20]; int age;}std;int main(void){ std.age =23; //直接使用std結構體變量 return 0;}

使用typedef方式定義結構體變量

typedef struct people1{ char name[20]; int age; }people1_t;int main(void){ people1_t p2; return 0;}

接下來我們再介紹結構體的兩種方式初始化:

#include 《stdio.h》#include 《string.h》struct people{ char name[20]; int age;};typedef struct people1{ char name[20]; int age; }people1_t;int main(void){ //方式一:在定義的變量的同時初始化 struct people p1 ={ .name = “xiaoming”, .age = 23 }; people1_t p2; //方式二: 定義變量后,再對其初始化 strcpy(&p2.name[0], “xiaohong”); p2.age = 45; printf(“p1.name = %s, age = %d. ”, p1.name, p1.age); printf(“p2.name = %s, age = %d. ”, p2.name, p2.age); return 0;}

編譯運行:

結構體的元素訪問

C語言中有兩種方式訪問,分別是“。”和“-》”, 具體參考如下代碼:

#include 《stdio.h》#include 《string.h》#include 《stdlib.h》struct people{ char name[20]; int age;};typedef struct people1{ char name[20]; int age; }people1_t;int main(void){ //定義結構體變量,并初始化 struct people p1 ={ .name = “xiaoming”, .age = 18 }; //定義結構體指針變量 people1_t *p2 = NULL; //申請people1_t結構體大小的堆內存空間,并將得到的起始地址賦予p2 p2 = (people1_t *)malloc(sizeof(people1_t)); if(NULL != p2) { //初始化 strcpy(&p2-》name[0], “xiaohong”); p2-》age = 26; } //結構體變量通過‘。’來訪問其元素 printf(“p1.name = %s, age = %d. ”, p1.name, p1.age); //結構體變量通過‘-》’來訪問其元素 printf(“p2.name = %s, age = %d. ”, p2-》name, p2-》age);}

編譯運行結果:

以上兩種方式都是使用下標式訪問結構體元素, 那么如何使用指針方式訪問呢?

#include 《stdio.h》#include 《string.h》#include 《stdlib.h》struct my_test{ int a; //4 double b; //8 char c; //1};int main(void){ struct my_test s1; s1.a = 12; s1.b = 3.4; s1.c = ‘a’; int *p1 = (int *)&s1; double *p2 = (double *)((long unsigned int)&s1 + 8); char *p3 = (char *)((long unsigned int)&s1 + 8 + 8); printf(“s1.a = %d. ”, s1.a); printf(“s1.b = %.1f. ”, s1.b); printf(“s1.c = %c. ”, s1.c); printf(“===================== ”); printf(“*p1 = %d. ”, *p1); printf(“*p2 = %.1f. ”, *p2); printf(“*p3 = %c. ”, *p3);}

分析:

int *p1 = (int *)&s1,其中&s1為結構體的起始地址,也是首元素a的地址,因此可以通過類型轉化后賦值給p1(int *類型,指向int類型的變量a)

double *p2 = (double *)((long unsigned int)&s1 + 8); 其中因為&s1是作為結構體地址,本身是帶有數據類型的,我們通過(long unsigned int)將其轉化成普通的長整型數值,然后再加上a(8字節)的長度,之后的地址就是結構體第二個元素b的地址了,于是乎將得到的地址轉化成double *類型賦值給p2,通過p2來訪問。

char *p3 = (char *)((long unsigned int)&s1 + 8 + 8); 與上步驟分析一致, 首先將&s1轉化成普通的普通的長整型數值,然后加上元素a 和 元素b的數據類型長度,就得到了元素c的地址,再賦值給p3,通過p3來訪問結構體元素c。

編譯運行結果:

總結

從數組到結構體的進步之處:數組有2個明顯的缺陷:第一個是定義時必須明確給出大小,且這個大小在以后不能再更改(這里不考慮可變數組);第二個是數組要求所有的元素的類型必須一致。

結構體就完美解決了數組的第二個缺陷的,可以將結構體理解為一個其中元素類型可以不相同的數組。結構體完全可以取代數組,只是在數組可用的范圍內數組比結構體更簡單,使用更方便。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7617

    瀏覽量

    138136
  • 代碼
    +關注

    關注

    30

    文章

    4846

    瀏覽量

    69259
  • 變量
    +關注

    關注

    0

    文章

    613

    瀏覽量

    28507
收藏 人收藏

    評論

    相關推薦

    分析C語言代碼結構的設計問題

    來分析一個C語言代碼結構的設計問題。 這段代碼,使用了兩次malloc,分別給 p1 和 p2 申請了內存。用完后,內存釋放,防止內存泄漏。 大家覺得,這樣的代碼設計有沒有問題。 代碼是某位學員在
    的頭像 發表于 02-11 09:31 ?83次閱讀

    深入理解C語言:循環語句的應用與優化技巧

    能讓你的代碼更加簡潔明了,還能顯著提升程序執行效率。本文將詳細介紹C語言中的三種常見循環結構——while循環、for循環和do...whi
    的頭像 發表于 12-07 01:11 ?293次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:循環語句的應用與優化技巧

    結構成員的順序會影響結構的大小嗎

    相同的結構成員,如果把順序調整一下,會不會影響結構的大小? 答案是會的,這主要跟字節對齊有關。 比如這樣的結構
    的頭像 發表于 11-25 16:24 ?293次閱讀

    C語言C++中結構的區別

    同樣是結構,看看在C語言C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?389次閱讀

    C語言與Java語言的對比

    C語言和Java語言都是當前編程領域中的重要成員,它們各自具有獨特的優勢和特點,適用于不同的應用場景。以下將從語法特性、內存管理、跨平臺性、性能、應用領域等多個方面對C
    的頭像 發表于 10-29 17:31 ?503次閱讀

    技術干貨驛站 ▏深入理解C語言:掌握程序結構知識

    在計算機編程的世界中,C語言被廣泛認可為一門強大而高效的編程語言,其簡潔的語法和直接的指令使得它成為了許多程序員的首選。了解C語言的程序
    的頭像 發表于 07-27 08:45 ?1561次閱讀
    技術干貨驛站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:掌握程序<b class='flag-5'>結構</b>知識

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?8次下載

    京準電鐘:GPS時鐘服務器(NTP授時服務器)資料詳細介紹

    京準電鐘:GPS時鐘服務器(NTP授時服務器)資料詳細介紹書 京準電鐘:GPS時鐘服務器(NTP授時服務器)資料詳細
    發表于 06-18 14:52

    PLC編程語言C語言的區別

    在工業自動化和計算機編程領域中,PLC(可編程邏輯控制器)編程語言C語言各自扮演著重要的角色。盡管兩者都是編程語言,但它們在多個方面存在顯著的區別。本文將從多個維度深入探討PLC編程
    的頭像 發表于 06-14 17:11 ?3423次閱讀

    c語言怎么做可視化界面

    C語言是一種通用的編程語言,廣泛應用于系統編程、嵌入式開發等領域。雖然C語言本身并不支持直接創建可視化界面,但通過結合一些圖形庫和工具,我們
    的頭像 發表于 06-06 10:46 ?2636次閱讀

    嵌入式中C語言結構基本實現

    C語言中的數組只能允許程序員定義存儲相同類型數據。但是結構C語言編程中允許您存儲不同數據類型的數據。
    的頭像 發表于 05-11 08:49 ?1155次閱讀
    嵌入式中<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>結構</b><b class='flag-5'>體</b>基本實現

    C語言結構史上最詳細的講解【軟件干貨】

    struct結構數據類型 前言 我們知道,在C語言中有一些基本的數據類型,如?char?int?float?long?double?string(
    的頭像 發表于 03-28 17:52 ?901次閱讀

    嵌入式系統中C語言結構的基礎實現與應用

    C語言中的數組只能允許程序員定義存儲相同類型數據。但是結構C語言編程中允許您存儲不同數據類型的數據。
    發表于 03-12 14:29 ?590次閱讀
    嵌入式系統中<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>結構</b><b class='flag-5'>體</b>的基礎實現與應用

    介紹C語言中錯誤處理和異常處理的一些常用的方法和策略

    C語言是一種低級的、靜態的、結構化的編程語言,它沒有提供像C++或Java等高級語言中的異常處理
    的頭像 發表于 02-28 14:25 ?718次閱讀

    C語言中的可變參數介紹

    C 語言為這種情況提供了一個解決方案,它允許您定義一個函數,能根據具體的需求接受可變數量的參數
    發表于 02-28 14:00 ?382次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的可變參數<b class='flag-5'>介紹</b>
    主站蜘蛛池模板: 亚洲欧美日本视频 | 中文字幕在线观看一区 | 久久久免费精品 | 日本亚洲精品色婷婷在线影院 | 国产一区美女 | 日本三级日本三级日本三级极 | 夜夜嗷| 免费国产在线视频 | 亚洲欧美视频 | 色综合久久久久综合99 | 欧美深深色噜噜狠狠yyy | 性孕妇洗澡video国产 | 1000部禁片黄的免费看 | 久久精品免费视频观看 | 开心激情五月网 | 91中文字幕视频 | 国产在线精品观看 | 三级网站在线看 | 国产视频一区二区在线观看 | 大尺度在线播放 | 精品国产麻豆免费人成网站 | 国产色妞妞在线视频免费播放 | 在线理论视频 | 四虎影院成人在线观看 | 国产精品久久福利网站 | 国产一区二区三区四卡 | 久久精品第一页 | 国产美女久久久 | 四虎在线最新永久免费 | 1024你懂的在线播放欧日韩 | 国产在线观看黄色 | 色综合中文字幕 | 亚洲综合色一区二区三区小说 | 奇米第四777| 日本老师69xxxxxxxxx | 国产农村妇女毛片精品久久 | 日本免费不卡一区 | 色婷婷久久合月综 | 国产美女在线观看 | 色丁香婷婷 | 亚欧美综合 |