重拾C,一天一點點_11

命令行參數數組

在支持C語言的環境中,能夠在程序開始執行時將命令行參數傳遞給程序。函數

調用主函數main時,它帶有兩個參數,第一個參數(argc,用於參數計數)的值表示運行程序時命令行參數的數目;第二個參數(argv用於參數向量)是一個指向字符串數組的指針,其中每一個字符串對應一個參數。this

  echo hello, world    //命令行中各參數間以空格隔開,hello,算一個參數spa

按照C語言的約定,argv[0]的值是啓動該程序的程序名,所以argc的值至少爲1.若是argc爲1,則說明程序名後面沒有命令行參數。argv[0]、argv[1]和argv[2]分別對應"echo"、"hello,"、"world"。最後一個可選參數爲argv[argc-1]。ANSI標準要求argv[argc]的值必須爲一空指針。命令行

//回顯程序命令行參數指針

 1 #include <stdio.h> 
 2 /****回顯程序命令行參數***/
 3 main(int argc, char *argv[]){
 4     /*
 5     int i;
 6     for(i=1; i<argc; i++){
 7         printf("%s%s",argv[i],(i<argc-1) ? " " : "");
 8     }
 9     */
10     while(--argc > 0){
11         printf("%s%s", *++argv, (argc > 1) ? " " : "");
12     }
13     printf("\n");
14     return 0;
15 }

UNIX系統中的C語言程序有一個公共的約定:以負號開頭的參數表示一個可選標誌或參數。假定用-x(表明「除...以外」)表示打印全部與模式不匹配的文本行,用-n(表明」行號「)表示打印行號,那麼如下命令:code

  find -x -n 模式    //打印全部與模式不匹配的行,並在每一個打印行的前面加上行號
指向函數的指針對象

  int (*comp)(void *, void *)  //代表comp是一個指向函數的指針,該函數有兩個void *類型的參數,其返回值類型爲intblog

  int *f();          //f函數,返回一個指向int類型的指針字符串

  int (*pf)();         //pf是一個指向函數的指針,返回int類型的對象

*是一個前綴運算符,其優先級低於(),也低於[]。

這一部分有點走過場了,回頭再增強吧。

結構:感受對象是結構的增強版

1 struct point{
2     int x;
3     int y;
4 }

關鍵字struct引入結構聲明,後接花括號。struct後面的名字可選,稱爲結構標記,用於爲結構命名。

struct {...} x, y, z;    //相似int x, y, z;聲明

若是結構聲明的後面不帶變量表,則不須要爲它分配存儲空間,僅描述一個結構的模板。

struct point pt;  //定義一個struct point類型的變量pt

 1 #include <stdio.h> 
 2 
 3 main(){
 4     struct point{
 5         int x;
 6         int y;
 7     };    
 8     struct point pt1;
 9     pt1.x = 100;
10     pt1.y = 150;
11     struct point pt2 = {200, 300}; 
12     printf("%d,%d\n", pt1.x, pt2.y);        //100,300
13     
14     struct rect{
15         struct point pt1;
16         struct point pt2;
17     };
18     struct rect re1 = {pt1, pt2};
19     printf("%d\n", re1.pt1.x);        //100
20 }
 1 #include <stdio.h>
 2 struct point makepoint(int x, int y);
 3 
 4 struct point{
 5     int x;
 6     int y;
 7 };
 8 main(){
 9     struct point pt1 = makepoint(100, 200);
10     printf("%d\n", pt1.x+pt1.y);            //300
11 }
12 
13 struct point makepoint(int x, int y){
14     struct point temp;
15     temp.x = x;
16     temp.y = y;
17     return temp;
18 }

 struct point *pp;    //定義一個指向struct point類型對象的指針。(*pp).x此處的圓括號不可省略,由於結構成員運算符「.」的優先級比「*」高。

結構指針使用頻度高,爲方便,可簡寫以下:

  p->結構成員    //p是一個指向結構的指針,有點相似$this->name

運算符.和->是從左至右結合的:  r.pt1.x  <=> rp->pt1.x

 附:

1.、老師給全班60個學生布置了兩道做業題,其中作對第一題的有31人,作對第二題的有40人,另有4人都作錯了,請問兩道題都作對的有幾我的?

  小學的題目,剛纔本身看了這題感受到有點繞了,呵呵,記得之前作這種題目仍是很厲害的,想當年了。

二、畢業了,寢室的5我的須要分書架,一共有3個如出一轍的書架,把這三個書架分給3我的,而後分到書架的三我的各拿出1000元,平均分給其他兩人。這樣一分,你們都以爲挺合理的。過後,其中一人算了半天也不知道到底一個書架是多少錢,你能告訴他嗎?

 

原文做者:lltong,博客園地址:http://www.cnblogs.com/lltong/

相關文章
相關標籤/搜索