基本C指针

时间:2012-06-02 00:28:37

标签: c pointers

我是C的初学者,并且一直试图弄清楚我的代码在过去一两个小时里出了什么问题。我一直在关注K& Rs的书,我一直在仔细研究它,但仍然不理解我的逻辑错误。

while (*argv>0){
    while (**argv>0){
        printf("%c\n",**argv);
        **argv++;
    }
    argv++;
}

任务:使用argv打印输出到我程序的所有参数。

据我所知,argv是一个指向数组的指针,该数组包含指向字符指针数组的更多指针。所以,我说虽然* argv> 0或者当第一个数组仍然有元素时,我们应该遵循从第一个数组到下一个数组的指针。然后我们应该打印出下一个数组中的所有元素。

4 个答案:

答案 0 :(得分:11)

这一行太多*:

**argv++;

应该是这样的:

*argv++;

另外还有大括号,因为++操作具有更高的优先级:

(*argv)++;

它会起作用。

答案 1 :(得分:9)

我建议您不要使用指针解除引用,当下标符号([])允许您执行相同的操作时,也不会混淆自己。

#include <stdio.h>

int main(int argc, char** argv)
{
    int i;
    for(i = 0; argv[i]; i++)
        printf("%s\n", argv[i]);
    return 0;
}

这也会打印argv[0],这是该程序的名称/路径。

现在我的代码做了什么?当for(i = 0; argv[i]; i++)解析为false(即i又名0)时,argv[i]0计算NULL到该元素,这是最后一个元素argv数组。然后对于数组中的每个元素,它使用%s格式说明符printf来打印它。您还可以将argv[i]作为第一个也是唯一的参数传递给printf,但这通常不赞成,因为它为某些字符串格式化攻击打开了大门。

答案 2 :(得分:6)

argv的类型为char *argv[],即指向字符串数组(char*)的指针。 argv++移动到数组中的下一个字符串。

通常这个函数写成如下:


int main(int argc, char *argv[]){
   int i;
   for (i = 0; i < argc; i++){ //loop from 0 to argc (argument count)
      printf("%s ", argv[i]);
   }
   return 0;
}


答案 3 :(得分:2)

这将起作用::

while(argc--)//can't use *argv here, because *argv would be the  address of the 
              // element which argv is pointing to, just by knowing the address u can't say whether it still has elements or not
{
    while( **argv )
    {
        printf("%c", **argv);
        (*argv)++;  //by using **argv++, you are actually moving argv to next array, not to the next character of current array 
    }
    argv++;
    printf("\n");//move your \n to here, else you will end up printing every character in a new line
}