C语言自定义char指针数组为何无法像argv一样执行*++a操作?
报错原因解析
这个错误的核心原因是C语言对函数参数中的数组声明和函数内定义的数组的处理规则完全不同:
- 首先看
argv为什么可以执行++操作
你在main函数参数中声明的char *argv[]不会被编译器当作数组类型处理,C语言标准规定:所有作为函数参数的数组类型声明,都会被自动调整为对应的指针类型。也就是说char *argv[]实际等价于char **argv,它是一个可修改的指针变量,属于合法的左值,所以++argv操作是允许的,作用是让指针向后偏移一个步长,指向数组的下一个元素。 - 再看自定义数组
a为什么报错
你在函数内部定义的char *a[] = {"Hello world", "c", "programming"};是实打实的数组定义,这里的a是数组名,代表数组首元素的固定地址,属于地址常量,不是可修改的左值,自增操作需要修改操作数的值,常量不能被修改,所以编译器会抛出lvalue required as increment operand的错误。
如果要实现和argv类似的遍历效果,可以额外定义一个指针变量指向数组首地址,再对指针做自增操作,示例如下:
#include <stdio.h> int main(int argc, char *argv[]) { char *a[] = {"Hello world", "c", "programming"}; char **p = a; printf("%s", *++p); // 合法,输出c printf("%s", *++argv); return 0; }
内容的提问来源于stack exchange,提问作者user12421304
相关产品推荐
相关产品推荐

