C語言學(xué)習(xí)之--容易混淆部分

第二部分C語言重難點(diǎn)部分的理解

一.指針

  1. 指針定義的理解

         #include<stdio.h>
         int main(void){
         
         //定義一個(gè)char類型的指針,和int類型的變量 
         char * pc;
         int num =4;
         
         //此時(shí)的含義是pc指向了num的首地址 夯膀;
         //指針的類型決定了取值的時(shí)候訪問多少內(nèi)存
         
         // 0000 0001 0000 0001
         // char * 獲取數(shù)據(jù), 0000 0001
         // short * 獲取數(shù)據(jù), 0000 0001 0000 0001 
         pc =  &num;
         
         
         // 指針可以參與運(yùn)算,但是僅限于+和-
         // p+1表示指針向后移動類型單位長度
         
         return 0;
     }
    
  2. 指針的用處

    1. 用函數(shù)實(shí)現(xiàn)兩個(gè)變量值的交換诗充,注意只是交換了地址也并不能交換值,必須交換兩個(gè)地址下的值才可實(shí)現(xiàn):

       //只交換兩個(gè)變量的地址,也不能實(shí)現(xiàn)交換
       void swap2(int *px,int *py){
       
           int *ptemp;
       
           ptemp = px;
           px = py;
           py = ptemp;
       }
      
      
       //通過指針改變了兩個(gè)值的內(nèi)容,實(shí)現(xiàn)了交換
       void swap3(int *px,int *py){
       //px -->a     py---->b
       int ptemp;
      
       ptemp = *px;    // ptemp = 3;
       *px = *py;      // a = b;      a = 5,b = 5
       *py = ptemp;    // b = 3;     b = 3;
       }       
      
    2. 通過指針能夠讓函數(shù)有多個(gè)返回值----所謂的多個(gè)返回值并不是多個(gè)return,而是一次性的修改多個(gè)變量的值

        /實(shí)現(xiàn)計(jì)算器
        void calculator(int x,int y,int *psum,int *pjian,int *pcheng,float *pchu){
        
            //把x+y的結(jié)果放到主調(diào)函數(shù)中 sum變量中
            *psum = x+y;
            *pjian = x-y;
            *pcheng = x*y;
            *pchu = x/(float)y;  
        }
  1. 二級指針---其實(shí)二級指針就是指向指針的指針

         //定義一個(gè)變量
         int a = 0;
         //定義一個(gè)一級指針指向a,假設(shè)a的地址為0xf2
         int *p = &a;
         p == 0xf2;
         *p == *0xf2 == a;
         //定義一個(gè)二級指針指向p
         int* *p1 = &p;
         //此時(shí)p1的內(nèi)存單元中存放的是p的地址,假設(shè)p的地址為0xf0
         p1 == 0xf0;
         *p1 == *0xf0這個(gè)地址所指向的內(nèi)容 == 0xf2
         **p1 == **0xf0 == *0xf2 == a;
    
  2. 數(shù)組指針

    1. 指向數(shù)組元素的指針

      1. 指針pa進(jìn)行+1或-1操作時(shí)不是內(nèi)存地址的加減,而是指向下一個(gè)數(shù)組元素或上一個(gè)

      2. 同一個(gè)數(shù)組中的兩個(gè)指針相減表示的是這兩個(gè)指針之間差多少個(gè)元素

         //定義一個(gè)數(shù)組
         int a[] = {1,2,3,4,5};
         //定義一個(gè)指針指向數(shù)組a
         int *ap = a;
         //利用該指針遍歷數(shù)組a
         for (int i = 0; i < 5; i++){
             printf("a[%d] = %d\n",i,*(ap+i));
         }
        
    2. 指針變量之間的運(yùn)算

      1. 表示兩個(gè)指針之間相隔了幾個(gè)元素 诱建,真實(shí)地地址差:(p1-p) * sizeof(int) //12
  3. 函數(shù)指針與指針函數(shù)的區(qū)別

    1. 函數(shù)指針是返回值是指針的函數(shù)蝴蜓; 如:char * getDay(int n){……}

    2. 指針函數(shù)是指向函數(shù)的指針;

       //格式:被指向的函數(shù)的返回值類型  (*函數(shù)指針變量名)(被指的函數(shù)的參數(shù));
       //定義了一個(gè)函數(shù)指針,指針變量名是pmax,它只能指向返回值是int 并且有兩個(gè)int類型參數(shù)的函數(shù)
       int (*pmax)(int x,int y);
       // 形參的名可以省略
       int (*pmax2)(int ,int );
      

二.程序的編譯及運(yùn)行

  1. C 語言程序從編寫源代碼到運(yùn)行經(jīng)歷哪些階段?
    1. 編寫源文件(源代碼)就是新建一個(gè)文本文件,然后編寫C語言源代碼int main() {...}
    2. 編譯(cc -c 文件名)利用命令cc -c 源文件名.c編譯源文件,然后生成目標(biāo)文件"原文件名.o"該編譯過程需要檢查語法等內(nèi)容,該文件是二進(jìn)制格式文件但是不能執(zhí)行
    3. 鏈接(cc 目標(biāo)文件) 將目標(biāo)文件與庫函數(shù)等鏈接到一起,使得程序可以執(zhí)行使用命令:cc 目標(biāo)文件名.o會默認(rèn)生成 a.out(assembly output(來源于Unix), 表示二進(jìn)制(binary)輸出文件)cc 1.c
  2. 注意事項(xiàng):

注意:在編寫程序,編譯的時(shí)候,如果檢查語法有錯(cuò)誤,就會報(bào)錯(cuò),阻止編譯繼續(xù)進(jìn)行但是函數(shù)比較特殊,如果函數(shù)調(diào)用,但是沒有提供函數(shù)的定義,那么會隱式的提供函數(shù)聲明.但是鏈接的時(shí)候,如果沒有提供函數(shù)體,那么就會報(bào)錯(cuò),阻止的鏈接的進(jìn)行,進(jìn)而不會生成可執(zhí)行文件茎匠;

三.宏的概念及無參宏定義方法

  1. 宏的定義: 宏: 預(yù)處理指令格仲,所有的以"#" 都是預(yù)處理指令,宏是一個(gè)特殊標(biāo)識符汽抚,代表一個(gè)字符串抓狭、數(shù)字伯病、表達(dá)式
  2. 宏的分類:
    1. 有參數(shù)的宏
    2. 無參數(shù)的宏
  3. 定義方式
    1. 無參數(shù)的宏的定義方式
      • 格式: #define 宏名 宏所代表的內(nèi)容
      • 注意:
        1. 不需要使用分號結(jié)束造烁,宏是一個(gè)預(yù)處理指令,不是語句
        2. 宏的名稱一般是大寫午笛,以便區(qū)別普通變量
        3. 宏惭蟋,一般我們寫在文件的開頭部分
    2. 有參數(shù)的宏的定義方式
      1. 格式:#define 宏名(形參) 宏代表的字符串
           #define  M(y) y*y+3*y
           #define  SUM(a,b) a+b
    2. 使用注意事項(xiàng)
        1. 有參宏的參數(shù)不會被分配內(nèi)存空間,不需要指定類型
        2. 有參宏展開的時(shí)候:
            1. 把實(shí)參帶入到宏的字符串中  
            2. 在出現(xiàn)宏名的地方用宏代表的字符串取替換
  1. 使用方式
    1. 宏可以參與運(yùn)算可以成為表達(dá)式的一部分
    2. 使用的注意事項(xiàng):
      1. 宏的替換 在程序編譯之前药磺,預(yù)處理程序 會把源代碼中所有出現(xiàn)宏名的地方就用用宏代表的內(nèi)容去替換告组,例外:當(dāng)宏名出現(xiàn)在字符串中,此時(shí)不會替換
      2. 宏定義的時(shí)候癌佩,可以嵌套
      3. 在程序中出現(xiàn)宏名的地方木缝,僅僅使用宏代表的值做替換
  2. 注意事項(xiàng)
    1. typedef和#define的區(qū)別

               //定義一個(gè)宏
               #define INT2 int *
               //這是給 int* 起個(gè)別名 INT
               typedef int * INT;
               
               int main(int argc, const char * argv[]) {
                   int num = 2;
                   //使用宏定義指針變量
                   INT2 p,p5;
                   // int *p,p5;
                   //p是一個(gè)指針變量
                   //p5 就是一個(gè)整形變量
      
                   //用typedef(定義)方式,定義指針變量
                   INT p1,p6;
                   //INT 原型 int *
                   //int *p1,*p6;
                   //p1 是指針變量
                   //p6也是指針變量
                   return 0;
               } 
      

四.代碼的練習(xí)

  1. 推箱子的小游戲
                #define kRows 10
        #define kCols 11
        #include<stdio.h>
        
        //定義一個(gè)函數(shù)實(shí)現(xiàn)地圖的繪制

        void drawMap(char map[kRows][kCols]) {
            for(int i = 0; i < kRows; i++){
                printf("%s\n",map[i]);
            }
        }
        
        //定義一個(gè)函數(shù)實(shí)現(xiàn)移動围辙,當(dāng)前位置元素和下一個(gè)位置的元素互換
        void movel(char map[kRows][kCols],int oldX,int oldY,int newX,int newY){
            
            char temp;
            temp=map[oldX][oldY];
            map[oldX][oldY]=map[newX][newY];
            map[newX][newY]=temp;
        } 
        
        int main(int argc ,const char * argv[]){
            
             //1.定義二維數(shù)組,用來保存地圖
            char map[kRows][kCols]={
                "##########",
                "#O ####  #",
                "# X####  #",
                "#        #",
                "######   #",
                "#  ####  #",
                "#        #",
                "#   ######",
                "#         ",
                "##########"};
            //2.繪制地圖 
            drawMap(map);
            
            //3.提示游戲的玩法
            
            printf("請控制小人移動:w.上  s.下 a.左 d.右    q.推出\n");
            //4.定義一些變量我碟,保存位置信息,保存玩家輸入的方向
            
             char direction;  //保存玩家輸入的方向
        
            // 保存用戶當(dāng)前的位置
            int personX = 1;
            int personY = 1;
            //初始化小人得下一個(gè)位置
            int nextX = personX;
            int nextY = personY;
            
             char street = ' ';
             char box = 'X';
             
              
            //保存箱子的當(dāng)前位置
            int boxX=2;
            int boxY=2;
             
             //5.編寫循環(huán)控制程序
             
             while(1){
                //1)接受玩家輸入的方向 a\n  d\n
                 
                 scanf("%c",&direction);
                 getchar();
                 
                 //防止穿墻
                 
                 nextX=personX;
                 nextY=personY;
                 
                 //2)根據(jù)玩家輸入的方向姚建,判斷將要移動的方向
                 
                 switch(direction){
                    case 'w':
                    case 'W':
                        //記錄小人的下一個(gè)位置
                         nextX--;
                         break;
                    case 's':
                    case 'S':
                        //記錄小人的下一個(gè)位置
                         nextX++;
                         break;
                    case 'a':
                    case 'A':
                        //記錄小人的下一個(gè)位置
                         nextY--;
                         break;
                    case 'd':
                    case 'D':
                        //記錄小人的下一個(gè)位置
                         nextY++;
                         break;
                         
                    case 'q':
                    case 'Q':
                        printf("程序正在退出...\n");
                        printf("程序已經(jīng)退出...\n");
                        return 0;
                        
                    default:
                        break;
                 } 
                 
                 
                 // 3)判斷小人的將要移動的位置是否是路
                 
                 if(map[nextX][nextY]==street){
                    
                    //如果是路矫俺,讓小人移動
                     movel(map,personX,personY,nextX,nextY);
                     //重新保存小人的最新位置
                     
                     personX=nextX;
                     personY=nextY;
                 } else if(map[nextX][nextY]==box){
                 
                 
                //   再判斷小人的下一個(gè)位置是否是箱子
                //   如果是箱子:
                //        1) 計(jì)算箱子的下一個(gè)位置
                    int boxNextX = boxX+(boxX-personX);
                    int boxNextY = boxY+(boxY-personY);
                //        2)  再判斷 箱子的下一個(gè)位置是否是路
                 if (map[boxNextX][boxNextY] == street) {
        
                // 如果是路:
                //   1)箱子和箱子下一個(gè)位置交換
                        movel(map, boxX, boxY, boxNextX, boxNextY);
                //  2)小人和箱子的位置進(jìn)行交換
                        movel(map, personX, personY, boxX, boxY);
                //  3)重新保存小人的位置,箱子的位置
                        boxX = boxNextX;
                        boxY = boxNextY;
        
                        personX = nextX;
                        personY = nextY;
        
                    }
                 
                
                 }
                 
                 drawMap(map);
                 if(boxY==9){
                    printf("哇哦啊,你推出來掸冤!");
                     break;
                 }
             } 
            
            
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厘托,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子稿湿,更是在濱河造成了極大的恐慌铅匹,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饺藤,死亡現(xiàn)場離奇詭異包斑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)策精,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門舰始,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咽袜,你說我怎么就攤上這事丸卷。” “怎么了询刹?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵谜嫉,是天一觀的道長萎坷。 經(jīng)常有香客問我,道長沐兰,這世上最難降的妖魔是什么哆档? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮住闯,結(jié)果婚禮上瓜浸,老公的妹妹穿的比我還像新娘。我一直安慰自己比原,他們只是感情好插佛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著量窘,像睡著了一般雇寇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚌铜,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天锨侯,我揣著相機(jī)與錄音,去河邊找鬼冬殃。 笑死囚痴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的造壮。 我是一名探鬼主播渡讼,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耳璧!你這毒婦竟也來了成箫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旨枯,失蹤者是張志新(化名)和其女友劉穎蹬昌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攀隔,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡皂贩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昆汹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片明刷。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖满粗,靈堂內(nèi)的尸體忽然破棺而出辈末,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布挤聘,位于F島的核電站轰枝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏组去。R本人自食惡果不足惜鞍陨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望从隆。 院中可真熱鬧诚撵,春花似錦、人聲如沸广料。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艾杏。三九已至,卻和暖如春盅藻,著一層夾襖步出監(jiān)牢的瞬間购桑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工氏淑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勃蜘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓假残,卻偏偏與公主長得像缭贡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子辉懒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

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

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型阳惹。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu)眶俩; ...
    朱森閱讀 3,446評論 3 44
  • 一莹汤、框架 1、Mac系統(tǒng)及常用工具颠印、進(jìn)制;C數(shù)據(jù)類型纲岭、常量變量、運(yùn)算符线罕、表達(dá)式止潮、格式化輸入輸出 2、關(guān)系運(yùn)算符钞楼、邏...
    師景福閱讀 692評論 0 2
  • 推薦指數(shù):???????? 推薦理由:有收縮毛孔的作用喇闸,我一般拿來濕敷,平時(shí)放冰箱里,濕敷時(shí)那酸爽~感覺毛孔都閉合...
    Swing阿姨閱讀 511評論 0 7
  • 1.1 JSON簡單介紹001 什么是JSON(1)JSON是一種輕量級的數(shù)據(jù)格式仅偎,一般用于數(shù)據(jù)交互(2)服務(wù)器返...
    年輕在于折騰閱讀 479評論 1 3