c++ 结构体初始化_【干货】c语言基础语法——结构体
1、關于C語言結構體的引入
學習環(huán)境搭建1_Linux C語言_嵌入式開發(fā)工程師-創(chuàng)客學院?www.makeru.com.cn在實際問題中有時候我們需要幾種數(shù)據(jù)類型一起來修飾某個變量。
例如一個學生的信息就需要學號(字符串),姓名(字符串),年齡(整形)等等。
這些數(shù)據(jù)類型都不同但是他們又是表示一個整體,要存在聯(lián)系,那么我們就需要一個新的數(shù)據(jù)類型。
——結構體,它就將不同類型的數(shù)據(jù)存放在一起,作為一個整體進行處理。
2、C語言使用結構體變量進一步加強了表示數(shù)據(jù)的能力
2.1;結構體聲明;
//申明一個結構體
struct book
{
char title[MAXTITL];//一個字符串表示的titile 題目 ;
char author[MAXAUTL];//一個字符串表示的author作者 ;
float value;//一個浮點型表示的value價格;
};//注意分號不能少,這也相當于一條語句;
這個聲明描述了一個由兩個字符數(shù)組和一個float變量組成的結構體。
但是注意,它并沒有創(chuàng)建一個實際的數(shù)據(jù)對象,而是描述了一個組成這類對象的元素。
因此,我們有時候也將結構體聲明叫做模板,因為它勾勒出數(shù)據(jù)該如何存儲,并沒有實例化數(shù)據(jù)對象。
下面介紹一下上面的結構體聲明;
1、首先使用關鍵字struct,它表示接下來是一個結構體。
2、后面是一個可選的標志(book),它是用來引用該結構體的快速標記。
因此我們以后就可以這樣創(chuàng)建數(shù)據(jù)對象
struct book library;//把library設為一個可以使用book結構體的結構體變量,則library這個變量就包含了其book結構體中的所有元素
3、接下來就是一個花括號,括起了結構體成員列表,及每個成員變量,使用的都是其自己的聲明方式來描述,用分號來結束描述;
例如:char title[MAXTITL];字符數(shù)組就是這樣聲明的,用分號結束;
注意:其中每個成員可以使用任何一種C數(shù)據(jù)結構甚至是其他的結構體,也是可以的;
4、在結束花括號后的分號表示結構體設計定義的結束。
2.2;關于其struct聲明的位置,也就是這段代碼要放到哪里。同樣這也是具有作用域的。
這種聲明如果放在任何函數(shù)的外面,那么則可選標記可以在本文件中,該聲明的后面的所有函數(shù)都可以使用。
如果這種聲明在某個函數(shù)的內部,則它的標記只能在內部使用,并且在其聲明之后;
2.3;關于我們不斷說的,標記名是可選的,那么我們什么時候可以省略,什么時候一定不能省略呢?
如果是上面那種聲明定義的方法,并且想在一個地方定義結構體設計,而在其他地方定義實際的結構體變量,那么就必須使用標記;
可以省略,設計的同時就創(chuàng)建該結構體變量,但是這種設計是一次性的。
關于結構體類型的定義的總結;
一般格式就是;
struct 結構體名(也就是可選標記名){ 成員變量;};//使用分號表示定義結束;
3、定義結構體變量
3.1;之前我們結構體類型的定義(結構體的聲明)只是告訴編譯器該如何表示數(shù)據(jù),但是它沒有讓計算機為其分配空間。
我們要使用結構體,那么就需要創(chuàng)建變量,也就是結構體變量;
創(chuàng)建一個結構體變量;struct book library;
看到這條指令,編譯器才會創(chuàng)建一個結構體變量library,此時編譯器才會按照book模板為該變量分配內存空間,并且這里存儲空間都是以這個變量結合在一起的。
這也是后面訪問結構體變量成員的時候,我們就要用到結構體變量名來訪問。
分析:
struct book的作用:
在結構體聲明中,struct book所起到的作用就像int,,,,等基礎數(shù)據(jù)類型名作用一樣。
struct book s1,s2,*ss;
定義兩個struct book結構體類型的結構體變量,還定義了一個指向該結構體的指針,其ss指針可以指向s1,s2,或者任何其他的book結構體變量。
其實;
struct book library;
等效于;
struct book{
char …
….
…..
}librar;
這兩種是等效的,只是第一種可以減少代碼的編寫量;
3.2;現(xiàn)在還是回到剛才提及的那個問題,可選標志符什么時候可以省略;
其一;
struct
{
char title[MAXTITL];
char author[MAXAUTL];
float value;
}library;
//注意這里不再是定義聲明結構體類型,而是直接創(chuàng)建結構體變量了,這個編譯器會分配內存的;
//這樣的確可以省略標識符也就是結構體名,但是只能使用一次;因為這是;聲明結構體的過程和定義結構體變量的過程和在了一起;并且個成員變量沒有初始化的;
//如果你想多次使用一個結構體模塊,這樣子是行不通的;
其二;
用typedef定義新類型名來代替已有類型名,即給已有類型重新命名;
一般格式為;typedef 已有類型 新類型名;
typedef int Elem;
typedef struct{
int date;
.....
.....
}STUDENT;
STUDENT stu1,stu2;
總結一下關于結構體變量的定義;
1;先定義結構體類型后再定義結構體變量;
格式為;struct 結構體名 變量名列表;
struct book s1,s2,*ss;//注意這種之前要先定義結構體類型后再定義變量;
2;在定義結構體類型的同時定義結構體變量;
格式為;
struct 結構體名
{
成員列表;
}變量名列表;//這里結構體名是可以省的,但盡量別省;
struct book
{
char title[MAXTITL];//一個字符串表示的titile 題目 ;
char author[MAXAUTL];//一個字符串表示的author作者 ;
float value;//一個浮點型表示的value價格;
}s1,s2
3;直接定義結構體類型變量,就是第二種中省略結構體名的情況;
這種方式不能指明結構體類型名而是直接定義結構體變量,并且在值定義一次結構體變量時適用,無結構體名的結構體類型是無法重復使用的。
也就是說,后面程序不能再定義此類型變量了,除非再寫一次重復的struct。
4、對于結構體變量的初始化
4.1;先回憶一下關于基本數(shù)據(jù)類型和數(shù)組類型的初始化;
int a = 0;
int array[4] = {1,2,3,4};//每個元素用逗號隔開
回憶一下數(shù)組初始化問題;
再回到結構體變量的初始化吧?
關于結構體變量的初始化與初始化數(shù)組類似;
也是使用花括號括起來,用逗號分隔的初始化好項目列表,注意每個初始化項目必須要和要初始化的結構體成員類型相匹配。
struct book s1={//對結構體初始化
"yuwen",//title為字符串
"guojiajiaoyun",//author為字符數(shù)組
22.5 //value為flaot型
};
//要對應起來,用逗號分隔開來,與數(shù)組初始化一樣;
4.2;加入一點小知識;
關于結構體初始化和存儲類時期的問題;
如果要初始化一個具有靜態(tài)存儲時期的結構體,初始化項目列表中的值必須是常量表達式;
4.3;注意如果在定義結構體變量的時候沒有初始化,那么后面就不能全部一起初始化了;
意思就是;
/這樣是可以的,在定義變量的時候就初始化了;
struct book s1={//對結構體初始化
"guojiajiaoyun",//author為字符數(shù)組
"yuwen",//title為字符串
22.5
};
/這種就不行了,在定義變量之后,若再要對變量的成員賦值,那么只能單個賦值了;
struct book s1;
s1={
"guojiajiaoyun",//author為字符數(shù)組
"yuwen",//title為字符串
22.5
};//這樣就是不行的,只能在定義的時候初始化才能全部賦值,之后就不能再全體賦值了,只能單個賦值;
只能;
s1.title = "yuwen";........//單個賦值;
4.4;對于結構體的指定初始化;
5、訪問結構體成員
5.1;結構體就像一個超級數(shù)組,在這個超級數(shù)組內,一個元素可以是char類型,下個元素就可以是flaot類型,再下個還可以是int數(shù)組型,這些都是存在的。
在數(shù)組里面我們通過下標可以訪問一個數(shù)組的各個元素,那么如何訪問結構體中的各個成員呢?
用結構成員運算符點(.)就可以了;
結構體變量名.成員名;
注意,點其結合性是自左至右的,它在所有的運算符中優(yōu)先級是最高的;
例如,s1.title指的就是s1的title部分,s1.author指的就是s1的author部分,s1.value指的就是s1的value部分。
然后就可以像字符數(shù)組那樣使用s1.title,像使用float數(shù)據(jù)類型一樣使用s1.value;
注意,s1;雖然是個結構體,但是s1.value卻是float型的。
因此s1.value就相當于float類型的變量名一樣,按照float類型來使用;
例如;printf(“%sn%sn%f”,s1.title,s1.author,s1.value);//訪問結構體變量元素
注意scanf(“%d”,&s1.value); 這語句存在兩個運算符,&和結構成員運算符點。
按照道理我們應該將(s1。value括起來,因為他們是整體,表示s1的value部分)但是我們不括起來也是一樣的,因為點的優(yōu)先級要高于&。
5.2;如果其成員本身又是一種結構體類型,那么可以通過若干個成員運算符,一級一級的找到最低一級成員再對其進行操作;
結構體變量名.成員.子成員………最低一級子成員;
struct date
{
int year;
int month;
int day;
};
struct student
{
char name[10];
struct date birthday;
}student1;
//若想引用student的出生年月日,可表示為;student.brithday.year;
brithday是student的成員;year是brithday的成員;
5.3;整體與分開
5.3.1;可以將一個結構體變量作為一個整體賦值給另一相同類型的結構體變量,可以到達整體賦值的效果;這個成員變量的值都將全部整體賦值給另外一個變量;
5.3.2;不能將一個結構體變量作為一個整體進行輸入和輸出;在輸入輸出結構體數(shù)據(jù)時,必須分別指明結構體變量的各成員;
-
總結;除開“相同類型的結構體變量可以相互整體賦值”外,其他情況下,不能整體引用,只能對各個成員分別引用;
https://jq.qq.com/?_wv=1027&k=LrSKKYES (二維碼自動識別)
總結
以上是生活随笔為你收集整理的c++ 结构体初始化_【干货】c语言基础语法——结构体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: checkbox控件的checked属性
- 下一篇: 火力发电厂与变电站设计防火规范_2019