V7 Echo程序增加一个常量指针,怎么样?

时间:2012-02-24 17:33:07

标签: c

#include <stdio.h>

 main(argc, argv)
 int argc;
 char *argv[];
 {
     register int i, nflg;

     nflg = 0;
     if(argc > 1 && argv[1][0] == '-' && argv[1][1] == 'n') {
      nflg++;
      argc--;
      argv++;     //Incements a constant pointer, how???
     }
     for(i=1; i<argc; i++) {
       fputs(argv[i], stdout);
       if (i < argc-1)
          putchar(' ');
     }
     if(nflg == 0)
       putchar('\n');
     exit(0);
 }

这个程序增加了argv的值,但是argv是C中的一个常量指针。为什么我从这里得不到编译错误?

2 个答案:

答案 0 :(得分:4)

argv不是const指针。它被定义为char *argv[]。由于这是K&R C,因此该定义与ANSI C中的定义不同。

其次,即使它被定义为const char *argv[],也就是指向常量字符串的常规指针。您不能通过该指针写入内存,但您可以更改指针本身。

指向常量字符串的常量指针将定义为const char ** const argv

答案 1 :(得分:2)

首先,argv的类型是char **(请记住,在函数参数声明的上下文中,T a[]T *a同义)。因此,它是指针类型,而不是数组类型,因此不会立即禁止使用++运算符。

其次,虽然这看起来像旧式的K&amp; R C,但它仍然被认为是有效的。以下是C99标准(n1256)对argcargv的说明:

5.1.2.2.1程序启动
...
2如果声明了它们,main函数的参数应遵循以下条件 限制:
...
- 参数argcargv以及argv数组指向的字符串应具有 可以由程序修改,并在程序之间保留它们最后存储的值 启动和程序终止。

所以表达式argv++完全合法。