最近在重新学习下c语言,浏览《c程序语言设计》。读到5.10节, 实现一个“find -x -n 模式”命令,x示意打印所有与模式不匹配得文本,-n示意打印行号。看似一个简略得编程。

书中在解决-nx命令选项的代码如下(通过删减):

#include <stdio.h>int main(int argc,char *argv[]){    char c;    while(--argc&&(*++argv)[0]=='-'){        while(c=*++argv[0]){            switch(c){            case 'x':                printf("x\n");                break;            case 'n':~~~~                printf("n\n");                break;            default :               printf("userage not right\n");            }        }    }}

(++argv)[0] 和++ argv[0] 看起来真的着实有点晕啊。相必很多人跟我一样,刚开始看到这几行代码不晓得啥意思。遂记录下来,供我当前参考,避免遗记。

main得参数argv的定义:char * argv[],argv 是一个字符指针,指向一个char \*的数组。如下图:  

++argv代表什么呢?因为* 和++ 的的优先级雷同,联合性是从右到左,因而*++argv首先计算++argv 。++argv将argv指针下移到下一个元素,在这里指向数组的第二个元素的地位。++argv 那么是第二个元素的值,是一个指向char的指针,如下图。

晓得了*++argv 那么(*++argv)[0],其实相当于*((*++argv)+0),是数组第二个元素的指向的第一个char的值。

如果第一个字符是‘-’,那么持续向下执行while(c=++argv[0]),判断是否是规定的属性,退出响应的解决形式。在上图的根底上,++argv[0]是什么呢。因为[]的运算符优先级高于++和* 因而,首先是计算argv[0],这个值是数组的值,是数组第二个元素的值。++argv[0]就是将指针指向下一个字符的地位,*++argv[0]