Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要帮助来理解C中的main()函数吗_C - Fatal编程技术网

需要帮助来理解C中的main()函数吗

需要帮助来理解C中的main()函数吗,c,C,我正在学习C编程,不太了解下面的程序,需要一些帮助来理解 问题1:主功能参数中*argv前面的两个星号有什么作用。 问题2:在main()函数中,为什么void后面跟着一个星号?它有什么作用? 问题3:&retval有“&”,变量“retval”是否指向内存地址 谢谢你的帮助 /** Main */ int main(int argc, char **argv) { pthread_t thread; void* retval; pthread_create(&

我正在学习C编程,不太了解下面的程序,需要一些帮助来理解

问题1:主功能参数中*argv前面的两个星号有什么作用。 问题2:在main()函数中,为什么void后面跟着一个星号?它有什么作用? 问题3:&retval有“&”,变量“retval”是否指向内存地址

谢谢你的帮助

 /** Main   */

int main(int argc, char **argv) {
    pthread_t thread;
    void* retval;

    pthread_create(&thread, NULL, thread_proc, NULL);

    printf("Hello from the main thread.\n");

    pthread_join(thread, &retval);
    printf("Done.\n");

    return 0;
}

*
是标记
指针的符号
您应该了解
c

1) 通过
char**argv
argv
被声明为指向
指针

2) 通过
void*
,它意味着可以保存任何类型变量的地址的变量

3) 由于
retval
是一个指针,它可以指向内存位置。通过
&retval
可以获得名为
retval
的变量的地址


&
称为
运算符的
地址。
*
是标记
指针的符号
您应该了解
c
中的指针
1) 通过
char**argv
argv
被声明为指向
指针

2) 通过
void*
,它意味着可以保存任何类型变量的地址的变量

3) 由于
retval
是一个指针,它可以指向内存位置。通过
&retval
可以获得名为
retval
的变量的地址


&
称为
运算符的
地址。
*
在c中用于声明指针。指针是一个变量,它保存存储在计算机内存中的变量的位置(字面上是地址)

所以在你的问题中,
void*retval声明一个空指针。空指针是一种特殊类型的指针,可以指向任何数据类型的对象

char **argv 

是指向char的指针。实际上,它是一个保存变量地址的变量,该变量是一个指针,c中的

*
用于声明指针。指针是一个变量,它保存存储在计算机内存中的变量的位置(字面上是地址)

所以在你的问题中,
void*retval声明一个空指针。空指针是一种特殊类型的指针,可以指向任何数据类型的对象

char **argv 

是指向char的指针。实际上,它是一个保存变量地址的变量,该变量是一个指针。
char**argv
相当于
char**argv
,大致意思是

一种内存地址值,当被访问时,它包含一个 访问时,包含包含第一个字符的内存地址值

C使用以null结尾的字符串,因此需要知道字符串结尾的是它开始的第一个内存地址。然后,其余例程搜索后续地址,查找空
\0
字符

C还使用以null结尾的列表,因此需要知道列表结尾的是列表开始的第一个内存地址(假设您知道列表的大小)。在这种情况下,列表的大小为
sizeof(*char)
,或者在英语中为“指向char的指针的大小”。其余的列表遍历例程随后搜索列表中的后续索引(后续内存偏移量),直到它被null字符终止


试着从右向左读,它读的是“指向字符指针的指针”,或者更简单地说是“字符串列表”。

char**argv
相当于
char**argv
,大致意思是

一种内存地址值,当被访问时,它包含一个 访问时,包含包含第一个字符的内存地址值

C使用以null结尾的字符串,因此需要知道字符串结尾的是它开始的第一个内存地址。然后,其余例程搜索后续地址,查找空
\0
字符

C还使用以null结尾的列表,因此需要知道列表结尾的是列表开始的第一个内存地址(假设您知道列表的大小)。在这种情况下,列表的大小为
sizeof(*char)
,或者在英语中为“指向char的指针的大小”。其余的列表遍历例程随后搜索列表中的后续索引(后续内存偏移量),直到它被null字符终止

试着从右向左读,它读的是“指向字符的指针”,或者更简单的说法是“字符串列表”。

回答一: char**argv表示您有一个二维char数组。 您可以这样访问它:

argv[0][2]
argv[0]
它给你一个字符。 但您可以这样访问:

argv[0][2]
argv[0]
谁给你一个字符*

在这里,“*”表示它是一个指针。 所以它不是直接在内存中的字符,而是一个包含字符地址的大小写。 有int*的事实;或字符*;或者任何东西,意味着你可能有一个数组

答复2: 空虚很简单。 你有一个指向某个你还不知道会是什么的东西的指针。 所以void*指针可以接受任何类型的值的地址,比如char、int或更复杂的类型,比如系统时间(这里是线程指针)

答复3: “&”表示:取该字段的地址。 所以如果我有

int i = 5;
printf("%i", i);
printf("%i", &i);
第一次打印将显示int:here 5的值。 第二个将向您显示i的地址,这里类似于0x06528A7 “&”的事实是,您可以这样做:

int *ptr;
int i = 5;

ptr = &i;
您现在可以发送“int*ptr”或其他函数来修改它。 总的来说,这太过分了。 因为在修改“ptr”时,您修改的是“i”,而不是副本。 希望它能帮助你

答案