C 将数组分配给指针
我被在C教程中找到的一行代码弄糊涂了。下面是代码:C 将数组分配给指针,c,arrays,pointers,variable-assignment,C,Arrays,Pointers,Variable Assignment,我被在C教程中找到的一行代码弄糊涂了。下面是代码: int main(int argc, char *argv[]){ ... char **inputs = argv+1; // This is the confusing line ... return 0; } 我不明白你怎么能把数组分配给那样的指针。如果有人能为我澄清这一点,我将非常高兴。谢谢你 数组名是指向数组第一个元素的常量指针 更多:- 数组名是指向数组第一个元素的常量指针 更多:- 函数参数中使用的数组始
int main(int argc, char *argv[]){
...
char **inputs = argv+1; // This is the confusing line
...
return 0;
}
我不明白你怎么能把数组分配给那样的指针。如果有人能为我澄清这一点,我将非常高兴。谢谢你 数组名是指向数组第一个元素的常量指针 更多:-
数组名是指向数组第一个元素的常量指针 更多:-
函数参数中使用的数组始终转换为指针 因此
char*argv[]
与char**argv
相同
argv[0]
包含程序名(或者在多重链接文件的情况下用于调用程序的名称),因此argv+1
只是程序的参数。函数参数中使用的数组始终转换为指针
因此char*argv[]
与char**argv
相同
argv[0]
包含程序名(或者在多重链接文件的情况下用于调用程序的名称),因此argv+1
只是程序的参数。假设您执行这样的程序
C:\Temp>myprog.exe hello world
操作系统获取这些字符串并将它们放在一起,形成一个空终止字符串数组:
{ "myprog.exe", "hello", "world", NULL }
然后它调用main()
,并将字符串数(3)作为argc
传递给它,以及指向此数组中第一个字符串的指针。此指针被调用为argv
,类型为char**
(char*argv[]
只是语法上的方便,在函数签名内部语义上是等价的)
但是您希望inputs
仅保存字符串“hello”和“world”,因此您需要使用此指针argc
,并指向下一个元素-向其中添加一个:
char **inputs = argv+1;
现在
inputs
指向{“hello”,“world”,NULL}
假设您执行这样的程序
C:\Temp>myprog.exe hello world
操作系统获取这些字符串并将它们放在一起,形成一个空终止字符串数组:
{ "myprog.exe", "hello", "world", NULL }
然后它调用main()
,并将字符串数(3)作为argc
传递给它,以及指向此数组中第一个字符串的指针。此指针被调用为argv
,类型为char**
(char*argv[]
只是语法上的方便,在函数签名内部语义上是等价的)
但是您希望inputs
仅保存字符串“hello”和“world”,因此您需要使用此指针argc
,并指向下一个元素-向其中添加一个:
char **inputs = argv+1;
现在输入
指向{“hello”,“world”,NULL}
注意
char *argv[]
是指针数组。数组声明本身是指针,argv是指针。因为这里有一个指针数组,所以argv是指向指针的指针,就像char**输入一样,因此
char **inputs = argv+1;
就是说输入等于指针argv加1,既然argv+1也是指针,那么就有一个指向指针的指针。注意
char *argv[]
是指针数组。数组声明本身是指针,argv是指针。因为这里有一个指针数组,所以argv是指向指针的指针,就像char**输入一样,因此
char **inputs = argv+1;
就是说输入等于指针argv加1,既然argv+1也是指针,那么就有一个指向指针的指针。
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”字符串
如果您使用%s
打印argv[0]
,则输出将是“exe”
,这是您的可执行名称;如果您使用%s
打印输入[0]
,则输出将是“first”
字符串
注意:即使没有传递任何参数intput
也会指向NULL(有效地址)。(其目的是指向输入参数字符串,或者说跳过程序名
“exe”
)
下面的代码示例及其输出集将帮助您理解。代码c:
#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;
}
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”字符串
如果您使用%s
打印argv[0]
,则输出将是“exe”
,这是您的可执行名称;如果您使用%s
打印输入[0]
,则输出将是“first”
字符串
注意:即使没有传递任何参数intput
也会指向NULL(有效地址)。(其目的是指向输入参数字符串,或者说跳过程序名
“exe”
)
下面的代码示例及其输出集将帮助您理解。代码c:
#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;
}
argv
在此上下文中不是数组;它是一个指针值。在函数参数声明的上下文中,ta[N]
和ta[]
等同于ta*a
;在这三种情况下,将a
声明为指向T
的指针
但是,即使
argv
是一个数组,仍然可以进行赋值。除非它是sizeof
或一元&
运算符的操作数,否则类型为“T的N元素数组”的表达式将转换(“衰减”)为类型为“指向T的指针”的表达式,表达式的值是数组第一个元素的地址。argv
在此上下文中不是数组;它是一个指针值。在函数参数声明的上下文中,