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; } 我不明白你怎么能把数组分配给那样的指针。如果有人能为我澄清这一点,我将非常高兴。谢谢你 数组名是指向数组第一个元素的常量指针 更多:- 数组名是指向数组第一个元素的常量指针 更多:- 函数参数中使用的数组始

我被在C教程中找到的一行代码弄糊涂了。下面是代码:

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
在此上下文中不是数组;它是一个指针值。在函数参数声明的上下文中,