成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【C語(yǔ)言趣味教程】typedef 真爽不爽不要玩 | 初識(shí)結(jié)構(gòu)體

Yangyang / 1788人閱讀

摘要:因?yàn)榻Y(jié)構(gòu)體支持所有數(shù)據(jù)類型,所以結(jié)構(gòu)體內(nèi)部也可以有數(shù)組存在??紤]到每次都是用語(yǔ)法來(lái)產(chǎn)生變量的方法未免過(guò)于繁瑣,語(yǔ)言允許將結(jié)構(gòu)體當(dāng)作一個(gè)數(shù)據(jù)類型來(lái)方便我們更好地使用。結(jié)構(gòu)體與當(dāng)然,還可以作用于結(jié)構(gòu)體。

前言:

本篇文章是一次大膽的嘗試,我想試著改變我那枯燥不堪的文筆,試著能不能幽默風(fēng)趣地講解知識(shí)點(diǎn)。如果效果好的話,我會(huì)進(jìn)一步嘗試!希望大家喜歡!


?學(xué)習(xí)結(jié)構(gòu)體之前,我們先來(lái)講講??非常 ??? 的 typedef 函數(shù)!

一、typedef 函數(shù)

0x00 函數(shù)介紹

?簡(jiǎn)單來(lái)說(shuō),typedef 可以將一個(gè)數(shù)據(jù)類型重命名,使用方法如下:?

? 額……那它有什么用呢?我們來(lái)看下面的例子:

?吐槽:unsigned char 真是又臭又長(zhǎng),用得讓我很不爽!我真是受夠了!使用 typedef ,你就可以給 unsigned char 取新的名字,不要998,只要學(xué)會(huì)它!就能給這個(gè)數(shù)據(jù)類型取名!你還在等什么?趕快來(lái)學(xué)吧!

? 舉個(gè)例子:將 unsigned char 重命名為 u_char

typedef unsigned char u_char;  ?           ?       ? 關(guān)鍵字      數(shù)據(jù)類型   新名字

這樣一來(lái),我們就可以用 u_char 來(lái)取代又臭又長(zhǎng)unsigned char 了!

unsigned char c;u_char c;

? 值得注意的是!typedef 的影響是有范圍限制的,只能在它所處的大括號(hào)內(nèi)使用,也就是出了作用域就會(huì)嗝屁。如果你想全局使用,可以在?#include?頭文件包含下面就定義 typedef,這樣它就有了?主角光環(huán)?!就不會(huì)這么輕易的狗帶了!如下所示:

#include #include typedef char* String; //我是帶有主角光環(huán)的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);  //還能進(jìn)行強(qiáng)制類型轉(zhuǎn)換    printf("Enter String: ");    scanf("%[^/n]", s);    free(s);  // s: 我免費(fèi)了!    return 0;}

這么一來(lái),typedef 就可以全局使用了。你學(xué)費(fèi)了嗎?親手敲一敲試試看!

二、初識(shí)結(jié)構(gòu)體

0x00 結(jié)構(gòu)體是個(gè)什么玩意

?結(jié)構(gòu)體是一些值的集合,這些值稱為成員變量。結(jié)構(gòu)的每個(gè)成員以是不同類型的變量。

如果說(shuō)數(shù)組是同一類型的變量集合,那么結(jié)構(gòu)體就是各種各樣變量的集合。因?yàn)榻Y(jié)構(gòu)體支持所有C數(shù)據(jù)類型,所以結(jié)構(gòu)體內(nèi)部也可以有數(shù)組存在。

? 舉個(gè)栗子,如果要保存學(xué)生的信息(學(xué)號(hào),姓名,年級(jí)),想將信息捆綁在一起,作為一個(gè)變量來(lái)管理會(huì)十分便利。像這樣把多個(gè)數(shù)據(jù)類型捆綁在一起的,就叫做結(jié)構(gòu)體。

0x01 聲明結(jié)構(gòu)體

?? 上述舉的例子(保存學(xué)生信息):

struct {    int id;    char name[26];    double gradePoints;} student;

但是,對(duì)于有多個(gè)學(xué)生的情況,需要多個(gè)這樣的變量??紤]到每次都是用 struct {} 語(yǔ)法來(lái)產(chǎn)生變量的方法未免過(guò)于繁瑣,C語(yǔ)言允許將結(jié)構(gòu)體當(dāng)作一個(gè)數(shù)據(jù)類型來(lái)方便我們更好地使用。如下所示,

ps:tag 表示?結(jié)構(gòu)體標(biāo)簽

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;

綜上所述得出總結(jié):結(jié)構(gòu)體是用戶自定義的類型 (user-defined type) 。

0x02 結(jié)構(gòu)體初始化

下面將演示結(jié)構(gòu)體變量聲明后初始化的過(guò)程:

??聲明變量時(shí)允許指定初始值:

為了接近結(jié)構(gòu)體的變量,我們可以使用 "點(diǎn)操作符(·)" 來(lái)獲取它。值得一提的是,字符串復(fù)制時(shí)要使用 strcpy。

0x01 結(jié)構(gòu)體與 typedef

? 當(dāng)然,typedef 還可以作用于結(jié)構(gòu)體。這樣可以讓結(jié)構(gòu)體用起來(lái)更爽,而不用拖著 struct name 又臭又長(zhǎng)的玩意來(lái)定義變量,使用方法如下:

? 之前舉的學(xué)生結(jié)構(gòu)體的例子,我們現(xiàn)在可以升級(jí)一下了:

? 使用 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;

?簡(jiǎn)直是爽炸了有木有!不爽不要玩!

0x02 定義結(jié)構(gòu)體的方法

① 匿名定義

簡(jiǎn)直是莽夫行為,莽就完事了!直接拿來(lái)就用,名字都懶得取了!

struct {    ...} var;

? 開玩笑開玩笑,這其實(shí)是傳說(shuō)中的 "匿名結(jié)構(gòu)體"?

?? 匿名結(jié)構(gòu)體:在聲明結(jié)構(gòu)的時(shí)候,可以不完全聲明。匿名結(jié)構(gòu)體在聲明時(shí)省略掉結(jié)構(gòu)體標(biāo)簽(tag),因?yàn)闆]有結(jié)構(gòu)體標(biāo)簽導(dǎo)致無(wú)法構(gòu)成類型,所以匿名結(jié)構(gòu)體自然只能用一次。

? 匿名結(jié)構(gòu)體使用方法演示:

struct {    int a;    char b;    float c;    double d;} s; struct {    int a;    char b;    float c;    double d;} *ps;

②?tag 定義(結(jié)構(gòu)體標(biāo)簽)

非常常見的定義結(jié)構(gòu)的方式

struct tag {    ...} var;struct tag var;

typedef 定義

?非常爽的定義方式,定義完之后用起來(lái)更加得心應(yīng)手!

typedef struct {    ...} test;test var;

當(dāng)然,如果你怕你忘了 test 是個(gè)啥,你也可以加上 tag?tag 多長(zhǎng)都沒事,反正你用?typedef 了。

typedef struct This_is_a_test {    ...} test;test var;

0x03 結(jié)構(gòu)體訪問

? 結(jié)構(gòu)體變量間也可以使用賦值操作符的。但是!只有是同一結(jié)構(gòu)體類型時(shí)才能使用。

??通俗點(diǎn)說(shuō),想要結(jié)構(gòu)體變量間賦值,它們得是同一個(gè)媽生的才行。

? 例子:

#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 復(fù)制后:/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;}

? 運(yùn)行結(jié)果:


?好了!我們點(diǎn)到為止,這一篇只是開個(gè)頭,下一篇我將會(huì)繼續(xù)講解結(jié)構(gòu)體!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/125079.html

相關(guān)文章

  • 趣味Python入門(一):初識(shí)Python

    摘要:盡管如此,還具有高級(jí)的數(shù)據(jù)類型和靈活性。它配備了大量的標(biāo)準(zhǔn)模塊,可用于程序庫(kù)。一些模塊提供如下功能通過(guò)這些很贊的特性,瞬時(shí)化身為面向過(guò)程的語(yǔ)言。開發(fā)者可以便捷地將解釋器連接到一個(gè)使用編寫的應(yīng)用程序,并能隨時(shí)用作擴(kuò)展。下一部分會(huì)繼續(xù)分享。 【編者按】本文作者是 Abhishek Jaiswal ,擅長(zhǎng) .NET、C#、Python 等多種語(yǔ)言的技術(shù)控。本文中,作者通過(guò)活潑有趣的口吻向大家...

    sutaking 評(píng)論0 收藏0
  • 一、初識(shí)c語(yǔ)言

    摘要:局部變量的作用域是變量所在的局部范圍。局部變量的生命周期是進(jìn)入作用域生命周期開始,出作用域生命周期結(jié)束。 目錄 1、什么是c語(yǔ)言? 2、數(shù)據(jù)類型 3、變量、常量 3.1 定義變量的方法 3.2 變量的分類 3.3 變量的作用域和生命周期 3.4定義常量的方法 4、關(guān)鍵字 1、什么是c語(yǔ)言?...

    MingjunYang 評(píng)論0 收藏0
  • 初識(shí) JNI

    摘要:初識(shí)本地接口概述是用于和本地代碼進(jìn)行交互操作的。針對(duì)的是語(yǔ)言,而不是。當(dāng)然,最初也有運(yùn)行的比較慢的原因,但隨著的不斷發(fā)展,編寫的代碼有時(shí)已經(jīng)不遜于一些的代碼了。聲明通過(guò)關(guān)鍵字標(biāo)識(shí),提醒編譯器該方法在外部定義。 初識(shí) JNI JNI, Java Native Interface(Java本地接口). 概述 JNI 是用于和本地 C 代碼進(jìn)行交互操作的API。實(shí)際上可以通過(guò)許多語(yǔ)言編寫,如...

    chavesgu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<