在 C 语言中将结构传递给函数

passing structure to function in c language

提问人:Mohan Singh Bisht 提问时间:4/9/2023 最后编辑:cafce25Mohan Singh Bisht 更新时间:4/26/2023 访问量:89

问:

谁能帮忙?为什么在此程序中调用函数时不需要“&”?但认为“&”在调用引用中是必需的。

#include <stdio.h>
#include <stdlib.h>

struct node {
    int data;
    struct node *next;
};

void traversal(struct node *ptr)
{
    while(ptr!=NULL)
    {
        printf("%d\n", ptr->data);
        ptr = ptr->next;
    }
}

int main()
{
    struct node *head;
    struct node *second;
    struct node *third;

    head = (struct node*) malloc(sizeof(struct node));
    second = (struct node*) malloc(sizeof(struct node));
    third = (struct node*) malloc(sizeof(struct node));

    head->data = 7;
    head->next = second;

    second->data = 5;
    second->next = third;

    third->data = 12;
    third->next = NULL;

    traversal(head);

    return 0;
}

谁能帮忙?为什么在此程序中调用函数时不需要“&”?但认为“&”在调用引用中是必需的。

C 指针 按引用传递 值传递 声明

评论

0赞 Weather Vane 4/9/2023
因为已经是一个指针,指向动态分配的指针。headstruct
0赞 Paul Hankin 4/9/2023
C 中没有“传递引用”。按值传递引用(指针)。
0赞 BoP 4/10/2023
此外,在 C 中不需要强制转换结果。指针转换来自是隐式的。(在 C++ 中需要强制转换,但无论如何都不应该使用)。mallocvoid*malloc

答:

1赞 Vlad from Moscow 4/9/2023 #1

您有一个单向链表,其中节点通过指针链接。

该函数不接受 类型的对象。它接受指向 类型的对象的指针。traversalstruct nodestruct node *

void traversal(struct node *ptr)
{
while(ptr!=NULL)
{
printf("%d\n", ptr->data);
ptr = ptr->next;
}
}

由于用作参数表达式的原始指针在函数中未更改,因此通过指向函数的指针通过引用将其传递给函数没有任何意义。

例如,取消引用函数中的指针

ptr->data

该函数可以直接访问指针指向的节点的数据成员。

也就是说,确实是类型的对象,通过指向函数的指针引用函数来传递。但指针本身是按值传递的。struct node

为了清楚起见,请考虑以下简单的演示程序。

#include <stdio.h>

void f( int *px )
{
    printf( "x = %d\n", *px );
}

int main( void )
{
    int x = 10;

    int *px = &x;

    f( px );
}

正如你所看到的,使用指针输出函数中声明的变量的值,不需要通过指针通过引用传递指针本身。但是,对象通过指针间接通过引用传递给函数。xmainfpxxxpx

3赞 Clifford 4/9/2023 #2

不要陷入 Cargo Cult 编程陷阱,在这种陷阱中,您看到一个模式并在不了解语义以及该模式为什么或何时合适的情况下应用它。

在这种情况下,要求不要盲目地将 an 应用于所有按引用传递调用。要求只是传递引用。在本例中为 .如果有一个对象,则运算符 () 的地址将生成一个 .但是,在您的例子中已经是 ,因此获取其地址将产生 (指向 的指针),而不是与 的参数声明匹配的类型。&struct node*struct node&struct node*headstruct node*struct node**struct nodetraversal()

也就是说,在这种情况下已经是正确的类型,您不需要获取它的地址,它已经是一个地址。head