在程序設計基礎當中咱們學習了變量,變量能夠節省使用空間相對於常量而言,你們來看下錶:編程
學號windows |
姓名 數組 |
職位網絡 |
性別數據結構 |
數學函數 |
英語佈局 |
語文學習 |
總成績spa |
1操作系統 |
劉琳 |
班委 |
女 |
50 |
61 |
56 |
167 |
2 |
張華 |
班委 |
男 |
60 |
60 |
54 |
174 |
3 |
張三 |
學生 |
男 |
66 |
62 |
52 |
180 |
4 |
陳露 |
班委 |
男 |
93 |
54 |
62 |
209 |
5 |
李明 |
班委 |
女 |
56 |
45 |
88 |
189 |
6 |
李講 |
班委 |
女 |
99 |
56 |
65 |
220 |
若是讓你把表中所要輸入的數據,每一個數據都用變量來輸入的話,那麼咱們就要定義多個變量,多個變量使用過程當中比較散亂,那麼有什麼更好的辦法來作這件事呢?這就像excel表格同樣,只要有了上面的字段名,分別填寫數據就行,那麼C語言中就提供了一種構造類型:結構體,它能夠很方便的構造出一個類型,這個類型是由多個變量(字段)組成的。
結構體:高級語言的一種構造類型。在程序的開發過程當中使用仍是比較普遍的。
(1) 結構體定義的通常格式:
struct 結構體名
{
類型 成員變量1;
類型 成員變量2;
….
類型 成員變量n;
};
注:結構體最後的分號不能省略
例如咱們定義學生結構體:
struct student { char name[20]; char sex[10]; int age; int score; };
結構體能夠像宏同樣定義在函數外部,做全局變量來用。也能夠定義在函數內部做爲局部變量來用。
(2) 結構體變量的定義格式:
struct 結構名 變量名;
例如根據上面定義的學生結構體
struct student stu;
操做實例以下:
結構體變量的引用,實際是引用其各個成員,要使用.或者->
普通變量使用 . 如上圖中的s.name s.sex s.age s.score
指針變量使用 –> 如上四個也可能改成s->name s->sex s->age s->score
初始化格式:
struct 結構名 變量名={值1,值2,….};
例:struct student stu={「張三」,」男」,18,100};
定義格式:struct 結構名 數組名[常量表達式];
例如學生結構體數組定義
struct student stu[20];
初始化結構體數組格式:
struct 結構名 數組名[常量表達式]={
{值1,值2,….},
……
{值1,值2,….}
};
struct student stu[3]={ { 「張三」,」男」,18,100}, { 「李四」,」男」,19,90}, { 「王五」,」男」,23,97} };
定義結構體類型的指針變量格式:
struct 結構名 *指針變量名;
例如學生結構體,定義指針變量s指向學生結構體類型
struct student *s;
第一種賦值方式:
struct ss { int a; int b; int c; }s; struct ss *p=&s;
第二種賦值方式:
struct ss { int a; int b; int c; }s; struct ss *p; p=&s;
當定義好結構體數組以後,能夠用指針指向,便於移動指針,訪問數組的不一樣位置的元素。
例如:
struct student stu[20],*p;
p=stu; //p指針指向stu數組的第一個元素
能夠經過p++的方式移動指針,指向後面的元素。
參數能夠結構體類型的變量、結構體數組
當時結構體數組時候,傳遞的是數組的首地址,是地址傳遞.
當須要把不一樣類型的變量存放到同一段內存單元或對同一段內存單元的數據按不一樣類型處理則須要使用共用體數據結構,共用體也稱爲聯合體。
例把一個整型變量一個字符型變量一個實型變量放在同一個地址開始的內存單元中
共用體的定義形式
union 共用體名
{
成員列表
}變量列表;
例如定義一個共用體,包括的數據成員有整型、字符型和實型。
union data { int i; char ch; float f; }a;
其中a爲定義的共用體變量,而union data是共用體類型,還能夠像結構體那樣將類型的聲明和變量定義分開;
union data a;
能夠看到共用體其實和結構體相似,可是必定要注意區分:
共用體各成員佔相同的起始地址所佔內存長度等於最長的成員所佔內存
結構體各成員佔不一樣的地址所佔內存長度等於所有成員所佔內存之和
共用體變量定義完成後,就能夠引用其中的成員數據進行使用,引用的通常形式爲:
共用體變量.成員名;
只能引用共用體變量的成員以下
union data a;
a.i;
a.ch;
a.f;
代碼參考:
/* Note:Your choice is C IDE */ #include "stdio.h" union data { int i; char ch; float f; }a; void main() { union data a; a.i=3; printf("%d\n",a.i); a.ch='a'; printf("%c\n",a.ch); a.f=1.1; printf("%f\n",a.f); }
在定義共用體變量時,能夠同時對變量進行初始化操做。初始化的值放在一對大括號中。
注意:
對共用體變量初始化時,只須要一個初始化值就足夠了,其類型必須和共用體的第一個成員的類型相一致
代碼實例以下
/* Note:Your choice is C IDE */ #include "stdio.h" union data { int i; char ch; }; void main() { union data a={97}; printf("%d\n",a.i); printf("%c\n",a.ch); }
7、 共用體類型數據的特色
共用體變量中的值是最後一次存放的成員的值如
a.i = 1;
a.ch = 'a';
a.f = 1.5;
完成以上三個賦值語句後共用體邊量的值是 1.5而 a.i=1 和 a.ch='a'已無心義
共用體變量不能初始化例
union data
{
int i;
char ch;
float f;
}a={1,'a', 1.5} 錯誤!!!
共用體經常使用來節省內存,特別是一些嵌入式編程,內存是很是寶貴的!
共用體也經常使用於操做系統數據結構或硬件數據結構!
union在操做系統底層的代碼中用的比較多,由於它在內存共賞佈局上方便且直觀。因此網絡編程,協議分析,內核代碼上有一些用到union都比較好懂,簡化了設計。
8、 共用體類型的注意事項
在使用共用體類型時,須要注意如下特色
1. 同一個內存段能夠用來存放幾種不一樣類型的成員,可是每一次只能存放其中一種,而不是同時存放全部的類型。也就說在共用體中,只有一個成員起做用,其餘成員不起做用。
2. 共用體變量中起做用的成員是最後一次存入的成員,在存入一個新的成員後原有的成員就失去做用
3. 共用體變量的地址和它的各成員的地址是同樣的
4. 不能對共用體變量名賦值,也不能企圖引用變量名來獲得一個值。
#include <stdio.h> #include <math.h> #include <windows.h> #include "time.h" int color(int c) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c); return 0; } int main() { //FILE *fp = fopen("graph.txt", "w+"); float x, y, f; int z; srand((unsigned)time); for(;;){ z=rand()%15+1; color(z); for(y = 1.6; y >= -1.6; y -= 0.15){ for(x = -1.1; x <= 1.1; x += 0.05){ f = x*x + pow(y - pow(x*x, 1.0/3), 2) - 1; //函數方程 //fputc(f <= 1E-5 ? '*' : ' ', fp); putchar(f <= 1E-5 ? '*' : ' ');//1E-5等價於1x10^(-5) } //fputc('\n', fp); putchar('\n'); } //fclose(fp); Sleep(100); system("cls"); } return 0; }