自定義類型: 結構體,枚舉,聯合

???1.結構體

???個人認為結構體和數組特別相似,只不過結構體和數組的區別在于結構體的成員可以是不同類型,而數組成員類型是相同的。
???(1)結構體的聲明
struct tag
{成員列表//至少得有一個成員
}值列表;//值列表可以省略
struct
{int a;char b;float c;
}x;//匿名結構體struct
{int a;char b;float c;
}a[5],*p;//匿名結構體
//注意上述的兩個匿名結構體雖然成員列表看似相同,但編譯器在進行編譯的時候絕不會將這兩個結構體看成是一樣的結構體,所以對于*p = &x,這種看法是絕對錯誤的
???(2)結構體成員
?????結構體成員可以是int,float,double,char等基本類型,也可以是數組,指針,甚至結構體,枚舉等都可以。結構體成員在訪問的時候采用結構結構體.成員名的方式來訪問如:
#include<stdio.h>
struct Student
{char name[20];int age;int grade;
};//學生類結構體
int main()
{struct Student student;.//定義一個學生結構體printf("%s\n", student.name);printf("%d\n", student.age);printf("%d\n", student.grade);return 0;
}
???由上可以看出,結構體的定義通過struct 結構體名來定義一個變量,但需要注意,單獨的聲明一個結構體類型,系統不為之開辟空間。
???舉個例子
struct Student
{char name[20];int age;int grade;
};//系統不為它開辟內存空間
struct Student student;//系統為之開辟內存空間
???(3)結構體成員的訪問
????結構體成員的訪問采用.的方式訪問,當有結構體指針的時候必須先對其解引用或者是結構體指針名 -> 成員名才可對其成員訪問。
????舉個例子
#include<stdio.h>struct Student
{char name[20];int age;int grade;
};//學生類結構體
int main()
{struct Student student;.//定義一個學生結構體stuct Student* student1;printf("%s\n", student.name);printf("%d\n", student.age);printf("%d\n", student.grade);printf("%d\n", (*student1).grade);//解引用的方式printf("%d\n", student1 -> age);//箭頭的方式return 0;
}
???(4)結構體的自引用
//方案一
struct Student
{char name[20];char sex[5];int age;struct Student* student;
};//方案二
typedef struct Student
{char name[20];char sex[5];int age;struct Student* Next;
}Student;//typedef定義一個新類型Student,以后在定義變量的時候可以直接用Student去定義一個結構體變量,而不用再用struct Student
???(5)結構體的初始化
struct Student
{char name[20];char sex[5];int age;int grade;
};
//方案一整體賦值
struct Student student = {"張三", "男", 20, 90};//方案二逐個賦值
struct Student student1;
strcpy(student1.name, "李四");
strcpy(student1.sex, "男");
student1,age = 20;
student1.grade = 89;
???(6)結構體的內存對齊
???結構體大小的計算
????幾條規則
????????1.結構體的第一個成員始終對齊于偏移量為0的地址(offsetof(結構體名, 成員名))處
????????2.后面的結構體成員對齊與某個數字(對齊數)的整數倍的地質處。其中對齊數在VS上默認是8,在Linux上默認是4。其中*對齊數* = 默認對齊數和自身成員大小的較小值
????????3.結構體的總大小為最大對齊數
????????4.結構體如果嵌套了結構體,嵌套的結構體對齊到自己的最大對齊數的整數倍的地址處。
????舉個例子
//VS下
#include<stdio.h>
int main()
{struct S1{char c1;//1int i;//3 4char c2;//1};//12struct S2{char c1;//1char c2;//1int i;//2 4};//8struct S3{double d;//8char c;//1int i;//3  4};//16struct S4{char c1;//1struct S3 s3;//7 16double d;//8};//32printf("%d\n", sizeof(struct S1));//12printf("%d\n", sizeof(struct S2));//8printf("%d\n", sizeof(struct S3));//16printf("%d\n", sizeof(struct S4));//32return 0;
}
?????不同平臺對地址的訪問要求不同,不是所有的硬件平臺都可以訪問任意地址的數據,有的硬件平臺規定某些平臺只能訪問某些特定的數據,所以當訪問不正確是會出現錯誤,而且如果沒有內存對其,有的數據本來一次可以訪問到,但卻要兩次訪問,這樣大大降低了內存的訪問速度,因此便有了結構體的內存對其。
???(7)結構體傳參
?????結構體在傳參時為了節省內存,在傳參時采用地址傳參,同時要對其成員進行訪問時可以通過對其地址解引用的方式訪問其成員
???(8)結構體的位段
?????舉個例子
struct A
{int _a:2;int _b:5;int _c:10;int _d:30;
};//位段類型
printf("%d\n",sizeof(struct A));//不同平臺結果不一樣
????A.位段的內存分配
?????a.位段成員只能是整型家族int,unsigned int , signed int,char
?????b.不跨平臺
?????c.按一字節或四字節方式分配
????B位段中的問題
??????a.將其當成有符號還是無符號不確定
??????b.成員內存從左分配還是從右分配不確定
??????c.當包含多個位段時,前一個位段所剩余內存應該舍棄還是保存都不確定
??????d.位段中最大位的數目不同機器不同

???2.枚舉

???(1)枚舉定義
??????將有限個可能取值都一一列舉出來
enum Sex
{MALE,FEMALE,SECRET
};
???(2)枚舉的優點
??????A.增加代碼可讀性和可維護性
??????B.比起宏定義來,枚舉對類型檢查較為嚴謹
??????C.使用方便,一次可以定義多個變量
??????D.具有一定的封裝代碼作用

???3.聯合體

???(1)聯合特點
??????聯合體公用一塊內存空間
#include<stdio.h>int main()
{union Un1{char c[5];//1int i;//4};//最大是5,但5不是最大對其數的倍數,所以是8union Un2{short c[7];//2  int i;//4};//最大是2 * 7 = 14, 但14不是最大對齊數4的倍數,所以變成了16printf("%d\n", sizeof(union Un2));return 0;
}

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

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

相關文章

詳解C++中的函數調用和下標以及成員訪問運算符的重載

http://www.jb51.net/article/78436.htm 這篇文章主要介紹了詳解C中的函數調用和下標以及成員訪問運算符,講到了這些二元運算符使用的語法及重載,需要的朋友可以參考下函數調用 使用括號調用的函數調用運算符是二元運算符。 語法 ?1primary-expression ( expression-list )備…

A計劃——BFS

【題目描述】 可憐的公主在一次次被魔王擄走一次次被騎士們救回來之后&#xff0c;而今&#xff0c;不幸的她再一次面臨生命的考驗。魔王已經發出消息說將在T時刻吃掉公主&#xff0c;因為他聽信謠言說吃公主的肉也能長生不老。年邁的國王正是心急如焚&#xff0c;告招天下勇士…

使用openssl的md5庫

http://blog.csdn.net/sinat_35297665/article/details/78244523 在linux機器上&#xff0c;有一個命令可以計算出文件的md5值&#xff0c;那就是md5sum&#xff0c;如果沒有的話&#xff0c;就需要安裝RPM包&#xff1a;coreutils。 現在我們使用openssl的庫也可以方便的計算出…

主席樹入門

今天學習了一下主席樹&#xff08;名字這么強的嘛&#xff09; 雖然直接理解起來不容易&#xff0c;但是這種解決問題的思想其實并不陌生。 我們可以首先來看維護整個區間第K大的線段樹 我們將[l,r]區間內數字的多少用線段樹進行維護&#xff0c;這樣的話為了求取區間第k大&…

Socket網絡編程--小小網盤程序(1)

http://www.cnblogs.com/wunaozai/p/3886588.html 這個系列是準備講基于Linux Socket進行文件傳輸。簡單的文件傳輸就是客戶端可以上傳文件&#xff0c;可以從服務器端下載文件。就這么兩個功能如果再加上身份驗證&#xff0c;就成了FTP服務器了&#xff0c;如果對用戶的操作再…

使用 Verdaccio 構建自己的私有 npm 倉庫

前言 無論你是公司的開發者&#xff0c;還是個人開發者&#xff0c;你可能都聽說過或者使用過 npm&#xff0c;這是一個使用廣泛的 JavaScript 包管理器。但是&#xff0c;你是否遇到過以下的問題&#xff1a;你需要一個私有的包存放地方&#xff0c;或者你需要在離線環境下使…

HDU - 4348To the moon——主席樹+區間修改

HDU - 4348To the moon 【題目描述】 【題目分析】 題目中說明每次更新后時間都會加1&#xff0c;而且還會需要查詢以前的區間&#xff0c;還會需要返回以前的時間&#xff0c;所以是很裸的主席樹。區間查詢的話我們同樣需要用到lazy標記 通過這道題我發現線段樹的操作還是很靈…

進入一個目錄需要那些權限

1.文件訪問者的分類 文件的訪問者具體可分為以下幾類&#xff1a; (1)擁有者 (2)組擁有者 (3)其他用戶 這些都代表什么意思呢&#xff1f; 其中r表示只讀&#xff0c;w表示只寫&#xff0c;x表示可執行&#xff0c;第一個字母代表了文件的類型&#xff0c;其中文件類型可以分為…

Socket網絡編程--小小網盤程序(2)

http://www.cnblogs.com/wunaozai/p/3887728.html 這一節將不會介紹太多的技術的問題&#xff0c;這節主要是搭建一個小小的框架&#xff0c;為了方便接下來的繼續編寫擴展程序。本次會在上一小節的基礎上加上一個身份驗證的功能。 因為網盤程序不像聊天程序&#xff0c;網盤是…

Linux下的重要目錄

1.bin目錄 主要防止系統下的各種必備可執行文件 2./proc 目錄 這個目錄相當于Windows下的計算機系統信息查看以及進程動態查看&#xff0c;可以查看計算機信息&#xff0c;用來存放當前計算機上的進程信息 3./sys 目錄 (1)其中block目錄用于存放塊設備文件 (2)bus存放總線類型…

HDU - 6278 Just $h$-index主席樹+二分

HDU - 6278 Just hhh-index 【題目描述】 【題目分析】 題目要求在區間[l,r][l,r][l,r]內大于h的數不少于h個&#xff0c;對于這種最大化問題&#xff0c;我們應該想到二分。 最小情況顯然是1.最大情況顯然是r?l1r-l1r?l1&#xff0c;對于一個hhh&#xff0c;我們如何判斷能…

Socket網絡編程--小小網盤程序(3)

http://www.cnblogs.com/wunaozai/p/3891062.html 接上一小節&#xff0c;這次增加另外的兩張表&#xff0c;用于記錄用戶是保存那些文件。增加傳上來的文件的文件指紋&#xff0c;使用MD5表示。 兩張表如下定義: 1 create table files(2 fid int,3 filename varchar(64),4 md…

LInux下du, df, top, free, pstack, su, sudo, adduser, password命令

1.du命令&#xff1a;du [選項] 文件 (1)功能該命令是顯示指定文件以及下的所有文件占用系統數據塊的情況&#xff0c;如果沒有文件&#xff0c;默認為是當前工作目錄 -a ???顯示所有文件對系統數據塊的使用情況 -b ???顯示數據塊大小時以字節為基本單位 -c ???除了顯…

HDU - 5919 Sequence II——主席樹+區間種類++逆序建樹

【題目描述】 HDU - 5919 Sequence II 【題目分析】 題目給定一個數組&#xff0c;每次查詢一個區間&#xff0c;找出區間內不同數字的個數x&#xff0c;然后輸出按出現順序第x/2向上取整個數字的位置。 按照要求&#xff0c;我們首先需要能夠找出給定區間不同的數字個數。 首…

Socket網絡編程--小小網盤程序(4)

http://www.cnblogs.com/wunaozai/p/3892729.html 在這一小節中實現了文件的下載&#xff0c;具體的思路是根據用戶的uid和用戶提供的文件名filename聯合兩張表&#xff0c;取得md5唯一標識符&#xff0c;然后操作這個標識符對應的文件發送給客戶端。 實現下載的小小網盤程序 …

靜態順序表的實現

實現對順序表的初始化&#xff0c;頭插&#xff0c;頭刪&#xff0c;尾插&#xff0c;尾刪&#xff0c; 任意下標的刪除&#xff0c; 任意下標處的的元素刪除&#xff0c;任意下標處的元素插入&#xff0c;任意元素的下標返回&#xff0c;任意下標處的元素返回&#xff0c; 刪除…

樹鏈剖分入門+HYSBZ - 1036樹的統計Count

今天學習了樹鏈剖分&#xff0c;記錄一下。 【題目背景】 HYSBZ - 1036樹的統計Count 【題目分析】 題目要求求任意結點之間路徑的和以及路徑上最大的結點&#xff0c;還有可能修改。如果正常做可能會很復雜&#xff08;我也不知道正常應該怎么做&#xff0c;應該要用到LCA什么…

Socket網絡編程--小小網盤程序(5)

http://www.cnblogs.com/wunaozai/p/3893469.html 各位好呀&#xff01;這一小節應該就是這個小小網盤程序的最后一小節了&#xff0c;這一節將實現最后的三個功能&#xff0c;即列出用戶在服務器中的文件列表&#xff0c;還有刪除用戶在服務器中的文件&#xff0c;最后的可以共…

進程相關概念

1.進程相關概念 進程是代碼的一次動態執行&#xff0c;擔當分配系統資源的角色&#xff0c;進程信息是被放在一個一個數據結構中&#xff0c;是一個結構體task_struct 2.進程控制塊內容 //linux下的進程控制塊 struct task_struct {volatile long state;// 說明了該進程是否可以…

SPOJ - QTREE3Query on a tree again!——樹鏈剖分

【題目描述】 SPOJ - QTREE3Query on a tree again! 【題目分析】 題目要求是輸出從111到xxx的路徑上遇到的第一個黑色的點。我們可以用樹鏈剖分&#xff08;不了解的同學請出門左拐&#xff0c;詳見樹鏈剖分入門&#xff09; 我們用線段樹維護每個區間第一次遇到黑點的位置&a…