重拾C,一天一点点_11

命令行参数

在支持C语言的环境中,可以在程序开始执行时将命令行参数传递给程序。

调用主函数main时,它带有两个参数,第一个参数(argc,用于参数计数)的值表示运行程序时命令行参数的数目;第二个参数(argv用于参数向量)是一个指向字符串数组的指针,其中每个字符串对应一个参数。

  echo hello, world    //命令行中各参数间以空格隔开,hello,算一个参数

按照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("
");
14     return 0;
15 }

UNIX系统中的C语言程序有一个公共的约定:以负号开头的参数表示一个可选标志或参数。假定用-x(代表“除...之外”)表示打印所有与模式不匹配的文本行,用-n(代表”行号“)表示打印行号,那么以下命令:

  find -x -n 模式    //打印所有与模式不匹配的行,并在每个打印行的前面加上行号
指向函数的指针

  int (*comp)(void *, void *)  //表明comp是一个指向函数的指针,该函数有两个void *类型的参数,其返回值类型为int

  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
", 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
", 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
", 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人都做错了,请问两道题都做对的有几个人?

  小学的题目,刚才自己看了这题感觉到有点绕了,呵呵,记得以前做这种题目还是很厉害的,想当年了。

2、毕业了,寝室的5个人需要分书架,一共有3个一模一样的书架,把这三个书架分给3个人,然后分到书架的三个人各拿出1000元,平均分给其余两人。这样一分,大家都觉得挺合理的。事后,其中一人算了半天也不知道到底一个书架是多少钱,你能告诉他吗?

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

原文地址:https://www.cnblogs.com/lltong/p/3393288.html