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

时间:2014-01-18 15:23:35

标签: c

我正在学习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;
}

5 个答案:

答案 0 :(得分:2)

答案一: char ** argv意味着你有一个二维char数组。 你可以像这样访问它:

argv[0][2]

它给你一个char。 但你可以像这样访问:

argv[0]

谁给你一个char *

在这里,'*'告诉它它是一个指针。 所以它不是直接在你的记忆中的一个字符,而是一个包含char的地址的情况。 有int *的事实;或char *;或任何*意味着你可能有一个数组。

答案2: 空虚*很简单。 你有一个指向你不知道它会是什么的东西。 因此,void *指针可以获取任何类型的值的地址,如char,int,r更复杂的类型,如系统时间(此处为线程指针)。

答案3: '&'意思是:取这个字段的地址。 所以,如果我有

int i = 5;
printf("%i", i);
printf("%i", &i);

第一个打印将显示int的值:这里5。 第二个将显示i的地址,这里的内容类似于0x06528A7 '&'的事实是你可以这样做:

int *ptr;
int i = 5;

ptr = &i;

您现在可以发送'int * ptr'或其他函数来修改它。 这将是主要的。 修改'ptr'时会导致修改'​​i'而不是副本。 希望它能帮到你!

答案 1 :(得分:2)

这个问题在开始学习C时有点混乱。

以下是可能有助于您入门的基本原则:

  1. C中只有几种基本类型:

    • char:一个整数值,大小为1个字节。

    • short:一个大小为2个字节的整数值。

    • long:一个大小为4个字节的整数值。

    • long long:一个大小为8个字节的整数值。

    • float:一个非整数值,大小为4个字节。

    • double:一个非整数值,大小为8个字节。

    请注意,每种类型的大小通常由编译器定义,不是由标准定义。

    整数类型shortlonglong long通常后跟int

    然而,这不是必须的,您可以在没有int的情况下使用它们。

    或者,您可以只声明int,但不同的编译器可能对此有不同的解释。

    总结一下:

    • shortshort int相同,但不一定与int相同。

    • longlong int相同,但不一定与int相同。

    • long longlong long int相同,但不一定与int相同。

    • 在给定的编译器上,intshort intlong intlong long int

  2. 如果声明某种类型的变量,那么您也可以声明指向它的另一个变量。

    例如:

    int a;

    int* b = &a;

    所以从本质上讲,对于每个基本类型,我们也有一个相应的指针类型。

    例如:shortshort*

    有两种方法可以“查看”变量b (这可能会让大多数初学者感到困惑)

    • 您可以将b视为int*类型的变量。

    • 您可以将*b视为int类型的变量。

    因此,有些人会声明int* b,而其他人会声明int *b

    但事实是这两个声明是相同的(空格毫无意义)。

    您可以使用b作为指向整数值的指针,或使用*b作为实际指向的整数值。

    您可以获取(读取)指向的值:int c = *b

    您可以设置(写入)指向的值:*b = 5

  3. 指针可以指向任何内存地址,而不仅仅指向您之前声明的某个变量的地址。但是,在使用指针时必须小心,以获取或设置位于指向的存储器地址的值。

    例如:

    int* a = (int*)0x8000000;

    这里,我们有变量a指向内存地址0x8000000。

    如果此内存地址未映射到程序的内存空间中,则使用*a进行的任何读取或写入操作都很可能导致程序因内存访问冲突而崩溃。

    您可以安全地更改a的值,但您应该非常小心地更改*a的值。

  4. 类型void*是例外,因为它没有可以使用的相应“值类型”(即,您不能声明void a)。此类型仅用作指向内存地址的通用指针,而不指定驻留在该地址中的数据类型。

答案 2 :(得分:1)

c中的

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

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

char **argv 

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

答案 3 :(得分:1)

char** argv相当于char **argv,大致意味着

  

访问时的内存地址值,包含内存地址值   当访问时包含一个包含第一个char的内存地址值

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

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

尝试从右到左阅读它,并且它读取“指向char的指针”,或者更简单地称为“字符串列表”。

答案 4 :(得分:0)

*是标记为pointer的符号您应该在c中了解指针。 1)在char** argv之后, argv被声明为pointerpointerchar

2)void*表示一个可以保存任何变量地址的变量。

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

&被称为address of运营商。