結構體的定義如下所示,struct為結構體關鍵字,tag為結構體的標志,member-list為結構體成員列表,其必須列出其所有成員;variable-list為此結構體聲明的變量。在一般情況下,tag、member-list、variable-list這3部分至少要出現2個。
結構體的成員可以包含其他結構體,也可以包含指向自己結構體類型的指針,而通常這種指針的應用是為了實現一些更高級的數據結構如鏈表和樹等。如果兩個結構體互相包含,則需要對其中一個結構體進行不完整聲明。
擴展資料:
一、結構體作用:
結構體和其他類型基礎數據類型一樣,例如int類型,char類型,只不過結構體可以做成你想要的數據類型,以方便日后的使用。?
在實際項目中,結構體是大量存在的,研發人員常使用結構體來封裝一些屬性來組成新的類型。由于C語言內部程序比較簡單,研發人員通常使用結構體創造新的“屬性”,其目的是簡化運算。?
結構體在函數中的作用不是簡便,其最主要的作用就是封裝。封裝的好處就是可以再次利用。讓使用者不必關心這個是什么,只要根據定義使用就可以了。
二、結構體的大小與內存對齊:
結構體的大小不是結構體元素單純相加就行的,因為我們主流的計算機使用的都是32bit字長的CPU,對這類型的CPU取4個字節的數要比取一個字節要高效,也更方便。
所以在結構體中每個成員的首地址都是4的整數倍的話,取數據元素時就會相對更高效,這就是內存對齊的由來。每個特定平臺上的編譯器都有自己的默認“對齊系數”(也叫對齊模數)。
程序員可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數,其中的n就是你要指定的“對齊系數”。
三、結構體的規則:
1、數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以后每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。
2、結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之后,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行。
3、結合1、2可推斷:當#pragma pack的n值等于或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果。
參考資料來源:百度百科-結構體
所謂結構體數組,是指數組中的每個元素都是一個結構體。在實際應用中,C語言結構體數組常被用來表示一個擁有相同數據結構的群體,比如一個班的學生、一個車間的職工等。
結構體可以存儲不同的數據類型,將他們互相聯系起來。結構體數組可以連續存儲多個結構體,和數組作用相似。比如想定義同一個最小外接矩形的四個坐標值,并給予這個矩形一個特征編號。當需要存儲多個最小外接矩形的信息時,就需要動態申請一個結構體數組。
struct 結構體類型名{類型名 成員名;類型名 成員名;……},先聲明結構體類型,再定義結構體變量名。聲明結構體類型,不分配空間,定義結構體類型變量,就要分配內存空間。
擴展資料:
結構體數組指針類型:
一個結構體變量的指針就是該變量所占據的內存段的起始地址。可以設一個指針變量,用來指向一個結構體變量,此時該指針變量的值是結構體變量的起始地址,指針變量也可以用來指向結構體數組中的元素。
1、類型一:
指向結構體變量的指針引用結構體變量中的成員。
2、類型二:
用結構體變量和指向結構體變量的指針構成鏈表,鏈表是一種常見的重要的數據結構。鏈表有一個“頭指針”變量,以head表示,它存放一個地址。該地址指向一個元素。
鏈表中的每一個元素稱為“結點”,每個結點都應包括兩個部分:
一是用戶需要用的實際數據,
二是下一個結點的地址。
鏈表中各元素在內存中的存儲單元可以是不連續的。要找某一元素,可以先找到上一個元素,根據它提供的下一元素地址找到下一個元素。這種鏈表的數據結構,必須利用結構體變量和指針才能實現。
可以聲明一個結構體類型,包含兩種成員,一種是用戶需要用的實際數據,另一種是用來存放下一結點地址的指針變量。
參考資料來源:百度百科—結構體類型—數組
C語言結構體類型的定義模板大概為:
struct 類型名{
成員表列
} 變量;
在C語言中,結構體(struct)指的是一種數據結構,是C語言中聚合數據類型(aggregate data
type)的一類。結構體可以被聲明為變量、指針或數組等,用以實現較復雜的數據結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。
在成員表列中可以是幾種基本數據類型,也可以是結構體類型。
struct 類型名{} 變量;后的分號不能漏
下面給出定義結構體類型的幾種方法:
1. 先定義結構體類型,再定義結構體變量。
struct student{??? char no[20];?????? //學號
char name[20];??? //姓名
char sex[5];??? //性別
int age;????????? //年齡};??
struct student stu1,stu2;//此時stu1,stu2為student結構體變量
2. 定義結構體類型的同時定義結構體變量。
struct student{??? char no[20];??????? //學號
char name[20];???? //姓名
char sex[5];????? //性別
int age;??????????? //年齡} stu1,stu2;
此時還可以繼續定義student結構體變量如:
struct student stu3;
一般不會使用第三種定義方法,因為直接定義結構體變量stu1,stu2后就不能再繼續定義該類型的變量。
參考資料:百度百科- 網頁鏈接
擴展資料:
C語言是一門通用計算機編程語言,廣泛應用于底層開發。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平臺的特性,以一個標準規格寫出的C語言程序可在許多電腦平臺上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平臺。
二十世紀八十年代,為了避免各開發廠商用的C語言語法產生差異,由美國國家標準局為C語言制定了一套完整的美國國家標準語法,稱為ANSI C,作為C語言最初的標準。[1]?目前2011年12月8日,國際標準化組織(ISO)和國際電工委員會(IEC)發布的C11標準是C語言的第三個官方標準,也是C語言的最新標準,該標準更好的支持了漢字函數名和漢字標識符,一定程度上實現了漢字編程。
C語言是一門面向過程的計算機編程語言,與C++,Java等面向對象的編程語言有所不同。
其編譯器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
首先,定義一個結構的一般形式為:
struct結構名
{
//成員表列
};
成員表由若干個成員組成,?每個成員都是該結構的一個組成部分。對每個成員也必須作類型說明,其形式為:“類型說明符?成員名;”。成員名的命名應符合標識符的書寫規定。例如:
struct?stu
{
int?num;
char?name[20];
char?sex;
float?score;
};
在這個結構定義中,結構名為stu,該結構由4個成員組成。?第一個成員為num,整型變量;第二個成員為name,字符型數組;第三個成員為sex,字符型變量;第四個成員為score,浮點型變量。?應注意在括號后的分號是必不可少的。
然后,當結構定義完成后,即創建了一種數據類型,可以像int、float等內置類型一樣使用,以上面定義的stu結構體來和int類型對比著看。
int?a;//定義一個int類型的變量a
stu?a;?//定義一個stu類型的變量a
int?*p;?//定義一個int類型的指針p
stu?*p;?//定義一個stu類型的指針p
int?a[10];//定義一個int類型的數組a,它有10個元素,每個元素是int類型
stu?a[10];//定義一個stu類型的數組a,它有10個元素,每個元素是stu類型。
struct name{
int x;
double y;
type a;
type b;
}
用的時候要用struct name c;
c.x是c的成員x,可以定義別名
typedef struct name Name;
Name c;
或者直接定義別名
typedef struct {
int a;
int b;
}Name;
拓展資料
C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平臺的特性,以一個標準規格寫出的C語言程序可在許多電腦平臺上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平臺。
二十世紀八十年代,為了避免各開發廠商用的C語言語法產生差異,由美國國家標準局為C語言制定了一套完整的美國國家標準語法,稱為ANSI C,作為C語言最初的標準。目前2011年12月8日,國際標準化組織(ISO)和國際電工委員會(IEC)發布的C11標準是C語言的第三個官方標準,也是C語言的最新標準,該標準更好的支持了漢字函數名和漢字標識符,一定程度上實現了漢字編程。
