摘要:因為結構體支持所有數據類型,所以結構體內部也可以有數組存在。考慮到每次都是用語法來產生變量的方法未免過于繁瑣,語言允許將結構體當作一個數據類型來方便我們更好地使用。結構體與當然,還可以作用于結構體。
本篇文章是一次大膽的嘗試,我想試著改變我那枯燥不堪的文筆,試著能不能幽默風趣地講解知識點。如果效果好的話,我會進一步嘗試!希望大家喜歡!
?學習結構體之前,我們先來講講??非常 ??? 的 typedef 函數!
?簡單來說,typedef 可以將一個數據類型重命名,使用方法如下:?
? 額……那它有什么用呢?我們來看下面的例子:
?吐槽:unsigned char 真是又臭又長,用得讓我很不爽!我真是受夠了!使用 typedef ,你就可以給 unsigned char 取新的名字,不要998,只要學會它!就能給這個數據類型取名!你還在等什么?趕快來學吧!
? 舉個例子:將 unsigned char 重命名為 u_char
typedef unsigned char u_char; ? ? ? 關鍵字 數據類型 新名字
這樣一來,我們就可以用 u_char 來取代又臭又長的 unsigned char 了!
unsigned char c;u_char c;
? 值得注意的是!typedef 的影響是有范圍限制的,只能在它所處的大括號內使用,也就是出了作用域就會嗝屁。如果你想全局使用,可以在?#include?頭文件包含下面就定義 typedef,這樣它就有了?主角光環?!就不會這么輕易的狗帶了!如下所示:
#include #include typedef char* String; //我是帶有主角光環的typedef ?int my_strlen(String str) { int i, cnt = 0; for(i = 0; str[i] != "/0"; i++) { cnt++; } return cnt;}int main(void) { String s = (String)malloc(sizeof(char) * 10); //還能進行強制類型轉換 printf("Enter String: "); scanf("%[^/n]", s); free(s); // s: 我免費了! return 0;}
這么一來,typedef 就可以全局使用了。你學費了嗎?親手敲一敲試試看!
?結構體是一些值的集合,這些值稱為成員變量。結構的每個成員以是不同類型的變量。
如果說數組是同一類型的變量集合,那么結構體就是各種各樣變量的集合。因為結構體支持所有C數據類型,所以結構體內部也可以有數組存在。
? 舉個栗子,如果要保存學生的信息(學號,姓名,年級),想將信息捆綁在一起,作為一個變量來管理會十分便利。像這樣把多個數據類型捆綁在一起的,就叫做結構體。
?? 上述舉的例子(保存學生信息):
struct { int id; char name[26]; double gradePoints;} student;
但是,對于有多個學生的情況,需要多個這樣的變量。考慮到每次都是用 struct {} 語法來產生變量的方法未免過于繁瑣,C語言允許將結構體當作一個數據類型來方便我們更好地使用。如下所示,
ps:tag 表示?結構體標簽
struct tag { type1 fieldName1; ... typeN fieldNameN;};struct tag variable_identifier1;struct tag variable_identifier2;
struct student{int id;char name[26];float grade;};struct student xiaoming;struct student xiaohong;
綜上所述得出總結:結構體是用戶自定義的類型 (user-defined type) 。
下面將演示結構體變量聲明后初始化的過程:
??聲明變量時允許指定初始值:
為了接近結構體的變量,我們可以使用 "點操作符(·)" 來獲取它。值得一提的是,字符串復制時要使用 strcpy。
? 當然,typedef 還可以作用于結構體。這樣可以讓結構體用起來更爽,而不用拖著 struct name 又臭又長的玩意來定義變量,使用方法如下:
? 之前舉的學生結構體的例子,我們現在可以升級一下了:
? 使用 typedef 前
struct student { int id; char name[26]; float grade;};struct student xiaohong;
? 使用 typedef 后:
typedef struct { int id; char name[26]; float grade;} stu;stu Park;
?簡直是爽炸了有木有!不爽不要玩!
① 匿名定義
簡直是莽夫行為,莽就完事了!直接拿來就用,名字都懶得取了!
struct { ...} var;
? 開玩笑開玩笑,這其實是傳說中的 "匿名結構體"?
?? 匿名結構體:在聲明結構的時候,可以不完全聲明。匿名結構體在聲明時省略掉結構體標簽(tag),因為沒有結構體標簽導致無法構成類型,所以匿名結構體自然只能用一次。
? 匿名結構體使用方法演示:
struct { int a; char b; float c; double d;} s; struct { int a; char b; float c; double d;} *ps;
②?tag 定義(結構體標簽)
非常常見的定義結構的方式
struct tag { ...} var;struct tag var;
③ typedef 定義
?非常爽的定義方式,定義完之后用起來更加得心應手!
typedef struct { ...} test;test var;
當然,如果你怕你忘了 test 是個啥,你也可以加上 tag?,tag 多長都沒事,反正你用?typedef 了。
typedef struct This_is_a_test { ...} test;test var;
? 結構體變量間也可以使用賦值操作符的。但是!只有是同一結構體類型時才能使用。
??通俗點說,想要結構體變量間賦值,它們得是同一個媽生的才行。
? 例子:
#include int main(void) { typedef struct { int year; int month; int day; } birthday; birthday A = {2000, 4, 12}; birthday B = {2002, 7, 9}; printf("A的生日: %d年%d月%d日/n", A.year, A.month, A.day); printf("B的生日: %d年%d月%d日/n", B.year, B.month, B.day); // 賦值 A = B; printf("A <- B 復制后:/n"); printf("A的生日: %d年%d月%d日/n", A.year, A.month, A.day); printf("B的生日: %d年%d月%d日/n", B.year, B.month, B.day); return 0;}
? 運行結果:
?好了!我們點到為止,這一篇只是開個頭,下一篇我將會繼續講解結構體!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/125079.html
摘要:盡管如此,還具有高級的數據類型和靈活性。它配備了大量的標準模塊,可用于程序庫。一些模塊提供如下功能通過這些很贊的特性,瞬時化身為面向過程的語言。開發者可以便捷地將解釋器連接到一個使用編寫的應用程序,并能隨時用作擴展。下一部分會繼續分享。 【編者按】本文作者是 Abhishek Jaiswal ,擅長 .NET、C#、Python 等多種語言的技術控。本文中,作者通過活潑有趣的口吻向大家...
摘要:局部變量的作用域是變量所在的局部范圍。局部變量的生命周期是進入作用域生命周期開始,出作用域生命周期結束。 目錄 1、什么是c語言? 2、數據類型 3、變量、常量 3.1 定義變量的方法 3.2 變量的分類 3.3 變量的作用域和生命周期 3.4定義常量的方法 4、關鍵字 1、什么是c語言?...
閱讀 1771·2021-11-25 09:43
閱讀 15322·2021-09-22 15:11
閱讀 2622·2019-08-30 13:19
閱讀 2009·2019-08-30 12:54
閱讀 1815·2019-08-29 13:06
閱讀 922·2019-08-26 14:07
閱讀 1612·2019-08-26 10:47
閱讀 3027·2019-08-26 10:41