#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中的一个常量指针。为什么我从这里得不到编译错误?
答案 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)对argc
和argv
的说明:
5.1.2.2.1程序启动
...
2如果声明了它们,main
函数的参数应遵循以下条件 限制:
...
- 参数argc
和argv
以及argv
数组指向的字符串应具有 可以由程序修改,并在程序之间保留它们最后存储的值 启动和程序终止。
所以表达式argv++
完全合法。