第三章、c語言高級(jí)階段

Day9.指針和結(jié)構(gòu)體

指針補(bǔ)充

1挤茄, 指針+1, 并不是真實(shí)的+1, 而是+4
2, 指針類型的兩個(gè)用途:
第一個(gè)用途, 取值的時(shí)候, 會(huì)根據(jù)指針類型所占用的字節(jié)去取出對(duì)應(yīng)字節(jié)的數(shù)據(jù)
第二個(gè)用途, 用于做加法運(yùn)算, 指針+1, 其實(shí)是加上指針類型所占用的長(zhǎng)度 , 如果當(dāng)前指針類型是int, 那么+1本質(zhì)上是加上4個(gè)字節(jié)
3记餐,只要一個(gè)指針指向了數(shù)組, 那么訪問數(shù)組就有3種方式:
1. : ages[0];
2. : p[0];
3. : *(p + 0);
4驮樊,指針字符串

    // 通過數(shù)組保存字符串和通過指針保存字符串的區(qū)別
    // 如果通過數(shù)組來保存字符串, 那么字符串是一個(gè)變量 str  可以修改
    // 如果通過指針來保存字符串, 那么字符串是一個(gè)常量 str2 不能修該
    // 數(shù)組保存的字符串存儲(chǔ)在內(nèi)存的棧中, 而通過指針保存的字符串存儲(chǔ)在常量區(qū)
    // 存儲(chǔ)在棧中的變量有一個(gè)特點(diǎn), 當(dāng)作用域結(jié)束系統(tǒng)會(huì)自動(dòng)釋放該變量
    // 存儲(chǔ)在常量區(qū)中的值有一個(gè)特點(diǎn), 不會(huì)被釋放, 而且多個(gè)相同的值對(duì)應(yīng)的地址相同

// 利用指針保存字符串的應(yīng)用場(chǎng)景
    for (int i = 0; i < 100; i++) {
        // 意味著會(huì)開辟100塊存儲(chǔ)空間來保存xmg這個(gè)字符串
        // 并且會(huì)釋放100次
//        char str5[] = "xmg";
        char *str6 = "xmg";
        printf("str5 = %s\n", str6);
    }
/*
     保存字符串的兩種方式:
     char str[] = "lnj";
     存儲(chǔ)的位置: 棧
     特點(diǎn): 相同的字符串會(huì)重復(fù)的分配存儲(chǔ)空間
           字符串可以修改
     
     char *str = "lnj"
     存儲(chǔ)的位置: 常量區(qū)
     特點(diǎn): 相同的字符串不會(huì)重復(fù)的分配存儲(chǔ)空間
            字符串不可以修改
     */

5,指向函數(shù)的指針

指向函數(shù)的指針的定義格式
     void (*funtionP) ();
     
     *    : 代表是一個(gè)指針
     funtionP    : 代表指針變量的名稱, 區(qū)分
     (*funtionP) : 代表將來指向一個(gè)函數(shù)
     void : 代表將來指向的函數(shù)沒有返回值
     ()   : 代表將來指向的函數(shù)沒有參數(shù)

int (*ageP)();
    ageP = getAge;
    printf("age = %i\n", ageP());
    
//    void (*sumP)(int v1, int v2);
    void (*sumP)(int, int);
    sumP = sum;
    sumP(10, 20);

    int (*sumP2)(int , int);
    sumP2 = sum2;
    printf("sum = %i\n", sumP2(10, 20));

結(jié)構(gòu)體

// 1.定義結(jié)構(gòu)體類型
    struct Person
    {
//        char name[20];
        char *name;
        int age;
        double height;
    };
    // 2.定義結(jié)構(gòu)體變量
//    int num;
    struct Person p;
    // 注意: 數(shù)組不能先定義再進(jìn)行一次性的初始化, 所有下面的寫法是錯(cuò)誤的
//    p.name = "lnj"; // name = {'l', 'n', 'j', '\0'};
    // 可以使用 結(jié)構(gòu)體變量名稱.屬性的方式給結(jié)構(gòu)體變量賦值
    p.name = "lnj";
    p.age = 30;
    p.height = 1.75;

/*
    int nums[] = {1, 3, 5};
    
    int nums[3];
    nums[0] = 1;
    nums[1] = 3;
    nums[2] = 5;
     
    int nums[3];
    nums = {1, 3, 5}; // 錯(cuò)誤
    
    int nums[3] = {[1] = 2};
     printf("nums[0] = %i\n", nums[0]);
    */
    
    struct Dog
    {
        char *name;
        int age;
        double height;
    };
    // 1.定義的同時(shí)初始化
    struct Dog sd = {"wc", 13, 5.0};
    
    // 2.先定義再初始化(逐個(gè)初始化)
    struct Dog sd1;
    sd1.name = "ww";
    sd1.age = 5;
    sd1.height = 10.9;
    
    // 3.先定義再初始化(一次性初始化)
    struct Dog sd2;
    // 特別注意: 結(jié)構(gòu)體和數(shù)組有一點(diǎn)區(qū)別, 數(shù)組不能先定義再進(jìn)行一次性的初始化, 而結(jié)構(gòu)體可以
    // 只不過需要明確的告訴系統(tǒng){}中是一個(gè)結(jié)構(gòu)體
    sd2 = (struct Dog){"xq", 8, 8.8}; // 數(shù)組? 結(jié)構(gòu)體?
    
    // 4.指定將數(shù)據(jù)賦值給指定的屬性
    struct Dog sd3 = {.height = 1.77, .name = "ww", .age = 33};
    
    printf("name = %s, age = %i, height = %lf\n", sd3.name, sd3.age, sd3.height);

枚舉

    // 1.定義枚舉類型
    // 定義枚舉類型的規(guī)范
    // 枚舉類型的取值一般以k開頭 后面跟上枚舉類型的名稱  跟上當(dāng)前取值的含義
    // 和結(jié)構(gòu)體一樣, 枚舉類型的名稱首字母大寫
    enum Season
    {
        kSeasonSpring,
        kSeasonSummer,
        kSeasonAutumn,
        kSeasonWinter
    };
    
    enum Gender
    {
        kGenderMale,
        kGenderFemale
    };
    
    enum Season es;
    es = kSeasonAutumn;
    
    enum Gender eg;
    eg = kGenderFemale;

局部和全局變量

/*
 局部變量
 概念: 局部變量就是定義在函數(shù), 代碼塊和函數(shù)形參列表中的變量, 我們就稱之為局部變量
 作用范圍: 從定義的那一行開始一直直到遇到大括號(hào)結(jié)束或者遇到return為止
 特點(diǎn): 
    相同作用域范圍內(nèi)不能出現(xiàn)同名的局部變量
    不同作用域范圍內(nèi)出現(xiàn)同名的局部變量, 內(nèi)部的局部變量會(huì)覆蓋外部的局部變量
注意:
    局部變量沒有固定的初始化值, 如果沒有對(duì)局部變量進(jìn)行初始化, 那么局部變量中是一些隨機(jī)的值, 所以在開發(fā)中千萬不要使用未初始化的局部變量
 存儲(chǔ)位置:
    局部變量存儲(chǔ)在棧中, 當(dāng)作用域結(jié)束系統(tǒng)會(huì)自動(dòng)釋放棧中的局部變量
 
 
 全局變量
 概念: 寫在函數(shù),代碼塊,形參列表外的變量, 我們就稱之為全局變量
 作用范圍: 從定義的那一行開始一直直到文件末尾(暫時(shí)這樣認(rèn)為)
 特點(diǎn):
    全局變量和局部變量可以同名
    如果存在和全局變量同名的局部變量, 那么局部變量會(huì)覆蓋全局變量
注意:
    全局變量如果沒有進(jìn)行初始化, 那么系統(tǒng)默認(rèn)會(huì)將全局變量初始化為0
 存儲(chǔ)位置:
    全局變量存儲(chǔ)在靜態(tài)區(qū)中, 他會(huì)隨著程序的啟動(dòng)而創(chuàng)建, 隨著程序的結(jié)束而結(jié)束
int num; // 全局變量  num = 0;
/*
     static應(yīng)用場(chǎng)景":
     當(dāng)某個(gè)方法的調(diào)用頻率非常高, 而該方法中更有些變量的值是固定不變的
     那么這個(gè)時(shí)候就可以使用static來修飾該變量, 讓該變量只開辟一次存儲(chǔ)空間
     這樣可以提高程序的效率和性能
     */
    static double pi = 3.1415926; // 固定

 宏定義在什么時(shí)候替換
 源代碼 --> 預(yù)處理 -->匯編 -->二進(jìn)制 -->可執(zhí)行程序
 規(guī)范:
 一般情況宏名都大寫, 多個(gè)單詞之間用_隔開, 并且每個(gè)單詞全部大寫
 有得公司又要求宏名以k開頭, 多個(gè)單詞之間用駝峰命名
#define CLASS_COUNT 100
#define kClassCount 100
帶參數(shù)
#define PF(v1) ((v1)*(v1))
// 提前結(jié)束宏定義的作用域
//#undef COUNT

typedef起別名

/*
 什么是typedef, 它有什么作用
 typedef可以給一個(gè)已知的數(shù)據(jù)類型起別名 (外號(hào))
 
 利用typedef給數(shù)據(jù)類型起別名的格式:
 
 typedef 原有的數(shù)據(jù)類型 別名(外號(hào));
 
 注意: 
 1. typedef不僅能給系統(tǒng)原有的數(shù)據(jù)類型起別名, 也可以給一個(gè)自定義的數(shù)據(jù)類型起別名
 2. 利用typedef給數(shù)據(jù)類型起別名, 并不會(huì)生成一個(gè)新的數(shù)據(jù)類型, 僅僅是給原有的類型起了一個(gè)別名而已
 */

int sum(int v1, int v2)
{
    return v1 + v2;
}

int minus(int v1, int v2)
{
    return v1 - v2;
}

// 注意: 如果是給指向函數(shù)的指針起別名, 那么指向函數(shù)的指針的指針名稱就是它的別名
// functionPotinter == int(*functionPotinter)(int , int)
typedef int(*functionPotinter)(int , int);
int main(int argc, const char * argv[]) {
   
    // 9如何定義變量 :   數(shù)據(jù)類型 變量名稱;
//    int (*sumP)(int , int ) = sum;
    functionPotinter sumP = sum;
    printf("sum = %i\n", sumP(10 , 20));
    
//    int (*minusP)(int, int) = minus;
    functionPotinter minusP = minus;
    printf("minus = %i\n", minusP(20, 10));
    return 0;
}

// ----------------------------給指針起別名----------------------------
// String == char *
typedef char * String;
void test4()
{
    //    char *name = "lnj";
    // 注意: 如果給指針起別名之后, 那么以后利用別名定義變量就不用再加*了
    String name = "lnj";
    printf("name = %s\n", name);
    
    
}

// ----------------------------給枚舉類型起別名----------------------------

// 1.先定義枚舉類型, 再給枚舉類型起別名
/*
 enum Gender
 {
 kGenderMale,
 kGenderFemale
 };
 typedef enum Gender SEX;
 */

// 2.定義枚舉類型的同時(shí)給枚舉類型起別名
/*
 typedef enum Gender
 {
 kGenderMale,
 kGenderFemale
 } SEX;
 */

// 3.定義枚舉類型的同時(shí)給枚舉類型起別名, 并且省略枚舉原有類型名稱
typedef enum
{
    kGenderMale,
    kGenderFemale
} SEX;

void test3()
{
    
    // 給枚舉起別名
    //    enum Gender sex;
    SEX sex;
    sex = kGenderMale;
    /*
     定義枚舉變量有3種方式
     1.先定義枚舉類型, 再定義枚舉變量
     2.定義枚舉類型的同時(shí)定義枚舉變量
     3.定義枚舉類型的同時(shí)定義枚舉變量, 并且省略枚舉類型名稱
     */
    /*
     enum Gender2
     {
     kGenderMale2,
     kGenderFemale2
     } sex2;
     sex2 = kGenderFemale2;
     
     enum
     {
     kGenderMale3,
     kGenderFemale3
     } sex3;
     sex3 = kGenderFemale3;
     */
    
}
// ----------------------------給結(jié)構(gòu)體類型起別名----------------------------


// 1.先定義結(jié)構(gòu)體類型, 再給類型起別名
/*
 struct Person
 {
 int age;
 double height;
 char *name;
 };
 // SPerson == struct Person
 typedef struct Person SPerson;
 */

// 2.定義結(jié)構(gòu)體類型的同時(shí), 給結(jié)構(gòu)體類型起別名
/*
 typedef struct Person
 {
 int age;
 double height;
 char *name;
 } SPerson;
 */

// 3.定義結(jié)構(gòu)體類型的同時(shí), 給結(jié)構(gòu)體類型起別名, 并且省略掉原有類型的名稱

 typedef struct
 {
 int age;
 double height;
 char *name;
 } SPerson;
void test2()
{
    /*
     // 給構(gòu)造類型起別名
     struct Person
     {
     int age;
     double height;
     char *name;
     };
     */
//    struct Person sp0;
    SPerson sp;
    SPerson sp1;
    SPerson sp2;
    SPerson sp3;
    SPerson sp4;
    /*
     結(jié)構(gòu)體變量的定義方式
     1.先定義類型再定義變量
     2.定義類型的同時(shí)定義變量
     3.定義類型的同時(shí)定義變量, 并且省略類型名稱
     */
}

// ----------------------------給基本數(shù)據(jù)類型起別名----------------------------
// Integer == int
typedef int Integer;
typedef Integer myInt;
// int float doulbe char
void test1()
{
    int num = 10;
    printf("num = %i\n", num);
    
    Integer age = 30;
    printf("age = %i\n", age);
    
    myInt score = 99;
    printf("score = %i\n", score);
}

// 一般情況下如果要給數(shù)據(jù)類型起一個(gè)名稱建議用typedef, 不要用define

最后的建議如果想了解透徹c語言還是看看代碼比較好片酝。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末囚衔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子雕沿,更是在濱河造成了極大的恐慌练湿,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件审轮,死亡現(xiàn)場(chǎng)離奇詭異肥哎,居然都是意外死亡辽俗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門篡诽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崖飘,“玉大人,你說我怎么就攤上這事杈女≈煸。” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵达椰,是天一觀的道長(zhǎng)翰蠢。 經(jīng)常有香客問我,道長(zhǎng)啰劲,這世上最難降的妖魔是什么梁沧? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮蝇裤,結(jié)果婚禮上廷支,老公的妹妹穿的比我還像新娘。我一直安慰自己栓辜,他們只是感情好酥泞,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啃憎,像睡著了一般芝囤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辛萍,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天悯姊,我揣著相機(jī)與錄音,去河邊找鬼贩毕。 笑死悯许,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辉阶。 我是一名探鬼主播先壕,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼谆甜!你這毒婦竟也來了垃僚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤规辱,失蹤者是張志新(化名)和其女友劉穎谆棺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罕袋,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡改淑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年碍岔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朵夏。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔼啦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仰猖,到底是詐尸還是另有隱情询吴,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布亮元,位于F島的核電站,受9級(jí)特大地震影響唠摹,放射性物質(zhì)發(fā)生泄漏爆捞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一勾拉、第九天 我趴在偏房一處隱蔽的房頂上張望煮甥。 院中可真熱鬧,春花似錦藕赞、人聲如沸成肘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽双霍。三九已至,卻和暖如春批销,著一層夾襖步出監(jiān)牢的瞬間洒闸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工均芽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丘逸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓掀宋,卻偏偏與公主長(zhǎng)得像深纲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劲妙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型湃鹊。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu)镣奋; ...
    朱森閱讀 3,449評(píng)論 3 44
  • 轉(zhuǎn)自:http://blog.csdn.net/soonfly/article/details/51131141 ...
    zwithz閱讀 1,032評(píng)論 0 13
  • 前言:復(fù)雜類型說明 要了解指針,多多少少會(huì)出現(xiàn)一些比較復(fù)雜的類型,所以我先介紹一下如何完全理解一個(gè)復(fù)雜類型,要理解...
    有理想有暴富的小青年閱讀 588評(píng)論 0 4
  • 現(xiàn)在的時(shí)間是凌晨1:40涛舍。 夜深。人靜唆途,心靜富雅,我才會(huì)有心思寫東西掸驱。換手機(jī)之前,一直有簡(jiǎn)書没佑,而換了手機(jī)一個(gè)月毕贼,才再下...
    答案汪三歲閱讀 624評(píng)論 4 3
  • 1.靜態(tài)修飾的變量或方法存放在堆內(nèi)存的方法區(qū)中 2.String類常用方法 charAt(int i)查找字符串某...
    安安靜靜寫代碼閱讀 188評(píng)論 0 0