我对在C教程中找到的一行代码感到困惑。这是代码:
int main(int argc, char *argv[]){
...
char **inputs = argv+1; // This is the confusing line
...
return 0;
}
我无法理解如何将数组分配给这样的指针。如果有人能为我澄清这一点,我会很高兴的。谢谢你!
答案 0 :(得分:2)
假设你执行这样的程序
C:\ Temp> myprog.exe hello world
操作系统接受这些字符串并将它们放在一个以空字符结尾的字符串数组中:
{ "myprog.exe", "hello", "world", NULL }
然后它调用main()
并将字符串数(3)传递给argc
,并将指针传递给该数组中的第一个字符串。这个指针是calles argv
,类型为char**
(char* argv[]
只是一种语法上的方便,在函数签名中语义相同)
但是你希望inputs
只保留字符串“hello”和“world”,所以你接受这个指针argc
,并指向下一个元素 - 添加一个:
char **inputs = argv+1;
现在inputs
指向{ "hello", "world", NULL }
。
答案 1 :(得分:2)
argv
是指向字符串的数组指针,最后一个指针为空。
假设您的可执行文件名为exe
,并按以下方式运行:
$ exe fist second
然后argv
是:
+----------+
argv---►| "exe" |
+----------+
argv + 1---►| "first" |
+----------+
argv + 2---►| "second" |
+----------+
argv + 3---►| null |
+----------+
* Notice last is null.
所以char** input = argv + 1
指向第一个输入参数的“first”字符串。
如果带有argv[0]
输出的%s
打印件"exe"
是您的可执行文件名,如果您打印input[0]
%s
输出,则{{} 1}}字符串。
注意:即使您没有传递任何参数"fisrt"
也会指向NULL(有效地址)。
(目的是指向输入参数字符串,或者说跳过程序名intput
)
我的以下代码示例及其输出集将帮助您理解 code.c:
"exe"
<强>输出:强>
#include<stdio.h>
int main(int argc, char* argv[]){
char** input = argv + 1;
while(*input) /* run untill input-->null */
printf("%s \n", *input++);
return 1;
}
答案 2 :(得分:0)
Array Name是指向数组
的第一个元素的常量指针更多: - http://forum.allaboutcircuits.com/showthread.php?t=56256
答案 3 :(得分:0)
函数参数中使用的数组总是转换为指针。
因此char *argv[]
与char **argv
相同。
argv[0]
包含程序名称(或者在多重链接文件的情况下用于调用程序的名称),因此argv+1
只是程序的参数。
答案 4 :(得分:0)
argv
在此上下文中不是数组;它是一个指针值。在函数参数声明的上下文中,T a[N]
和T a[]
等同于T *a
;在所有三个中声明a
作为指向T
的指针。
但是,即使argv
是数组,仍然可以进行分配。除非它是sizeof
或一元&
运算符的操作数,否则将“{元素数组T
”类型的表达式转换(“衰减”)为表达式“指向T
“的指针,表达式的值是数组第一个元素的地址。
答案 5 :(得分:-1)
请注意
char *argv[]
是一个指针数组。数组声明,是一个指针本身,argv是一个指针。从这里我们有一个指针数组,argv是一个指向指针的指针,就像char **输入一样,因此
char **inputs = argv+1;
只是说输入等于指针argv加一,因为argv + 1也是一个指针,那么你有一个指向指针的指针。