基于我对指向字符数组的指针的理解,
% ./pointer one two
argv
+----+ +----+
| . | ---> | . | ---> "./pointer\0"
+----+ +----+
| . | ---> "one\0"
+----+
| . | ---> "two\0"
+----+
来自代码:
int main(int argc, char **argv) {
printf("Value of argv[1]: %s", argv[1]);
}
我的问题是,为什么argv [1]可以接受?为什么它不像(* argv)[1]?
我的理解步骤:
答案 0 :(得分:16)
将[]
视为指针而非数组的运算符更为方便;它与两者一起使用,但由于数组衰减到指针数组索引仍然有意义,如果它以这种方式看待。所以基本上它会偏移,然后取消引用,指针。
所以使用argv[1]
,你真正得到的是*(argv + 1)
用更方便的语法表达。这为char *
指向的内存块提供了第二个argv
,因为char *
是argv
指向的类型,[1]
偏移{{ 1}}按argv
个字节,然后取消引用结果。
sizeof(char *)
首先使用(*argv)[1]
取消引用argv
以获取指向*
的第一个指针,然后将其偏移char
个字节,然后取消引用 获得1 * sizeof(char)
。这给出了char
指向的字符串组的第一个字符串中的第二个字符,这显然与argv
不同。
因此,将索引数组变量视为由“偏移然后取消引用指针”运算符操作的指针。
答案 1 :(得分:12)
因为argv
是指向char
指针的指针,所以argv[1]
是指向char
的指针。 printf()
格式%s
需要一个指向char参数的指针,并打印该参数指向的以null结尾的字符数组。由于argv[1]
不是空指针,因此没有问题。
(*argv)[1]
也是有效的C,但(*argv)
相当于argv[0]
,是char
的指针,因此(*argv)[1]
是{的第二个字符{ {1}},在您的示例中为argv[0]
。
答案 2 :(得分:5)
将指针索引为数组会隐式取消引用它。 p[0]
为*p
,p[1]
为*(p + 1)
等。