读书笔记:c指针数组

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

书中在处理-nx命令选项的代码如下(经过删减):

#include 
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 \*的数组。如下图:
  

image.png

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

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

如果第一个字符是‘-’,那么继续向下执行while(c=++argv[0]),判断是否是规定的属性,加入响应的处理方式。在上图的基础上,++argv[0]是什么呢。因为[]的运算符优先级高于++和* 因此,首先是计算argv[0],这个值是数组的值,是数组第二个元素的值。++argv[0]就是将指针指向下一个字符的位置,*++argv[0]
image.png

你可能感兴趣的:(c)