如何在 C 中调用带有结构指针作为参数的 void 函数?

How to call a void function with a struct pointer as parameter in C?

我真正需要的只是关于如何 return 这些类型的函数给它的调用者的例子。除了函数和参数的类型之外,甚至不必与我的代码相关。

我在下面写了这个函数,它应该读取三个用户定义的人的姓名和年龄。

void readData(Person *p) 
{
    char name1[20], name2[20], name3[20];
    int age1, age2, age3;
    printf("Enter person 1: \n");
    scanf("%s %d", &name1, &age1);
    printf("Enter person 2: \n");
    scanf("%s %d", &name2, &age2);
    printf("Enter person 3: \n");
    scanf("%s %d", &name3, &age3);
    struct person1 {char name1[20]; int age1};
    struct person2 {char name2[20]; int age2};
    struct person3 {char name3[20]; int age3};
    struct Person {struct person1; struct person2; struct person3};
    struct Person man[3] = {{name1, age1}, {name2, age2}, {name3, age3}};
    p = &man;
}

我想重新使用上面函数的变量,以便我可以在下面的函数中使用它。我应该怎么做,因为我不能 're-declare' 变量,因为它们是用户定义的?我是通过参考还是价值来调用,如果是,我该怎么做?我需要 return 什么吗?我找不到此类功能的示例,非常感谢任何帮助。

Person findMiddleAge(Person *p) 
{
    int middle;
    if ((age1 < age2 && age2 < age3) || (age3 < age2 && age2 < age1)) {
        middle = age2;
        struct Person man[1] = {name2, age2};
        }
    else if ((age2 < age1 && age1 < age3) || (age3 < age1 && age1 < age2)) {
            middle = age1; 
            struct Person man[1] = {name1, age1};
            }
    else if ((age1 < age3 && age3 < age2) || (age2 < age3 && age3 < age1)) {
        middle = age3;
        struct Person man[1] = {name3, age3};
        }
    printf("%d \n", middle);
}

下面的代码块显示了我的整个代码,以防万一。 除了 readData(Person *p)Person findMiddleAge(Person *p) 函数中的代码行外,无法修改任何内容。

typedef struct {
   char name[20]; 
   int age;
} Person; 

void readData(Person *p);
Person findMiddleAge(Person *p);
int main() 
{
   Person man[3], middle;   

   readData(man);
   middle = findMiddleAge(man);
   printf("findMiddleAge(): %s %d\n", middle.name, middle.age);
   return 0;
}

void readData(Person *p) 
{
    char name1[20], name2[20], name3[20];
    int age1, age2, age3;
    printf("Enter person 1: \n");
    scanf("%s %d", &name1, &age1);
    printf("Enter person 2: \n");
    scanf("%s %d", &name2, &age2);
    printf("Enter person 3: \n");
    scanf("%s %d", &name3, &age3);
    struct person1 {char name1[20]; int age1};
    struct person2 {char name2[20]; int age2};
    struct person3 {char name3[20]; int age3};
    struct Person {struct person1; struct person2; struct person3};
    struct Person man[3] = {{name1, age1}, {name2, age2}, {name3, age3}};
    p = &man;
}

Person findMiddleAge(Person *p) 
{
    int middle;
    if ((age1 < age2 && age2 < age3) || (age3 < age2 && age2 < age1)) {
        middle = age2;
        struct Person man[1] = {name2, age2};
        }
    else if ((age2 < age1 && age1 < age3) || (age3 < age1 && age1 < age2)) {
            middle = age1; 
            struct Person man[1] = {name1, age1};
            }
    else if ((age1 < age3 && age3 < age2) || (age2 < age3 && age3 < age1)) {
        middle = age3;
        struct Person man[1] = {name3, age3};
        }
    printf("%d \n", middle);
}

是的,这是作业,但我真的尽力了(我试了 6 个多小时才得到想要的结果,但我还是做不到,C 对我来说真的很难理解)。我应该找到年龄在三个人中间的那个人,并且 return 这个人的名字和年龄给来电者。我做错了一切吗?我其实只是想知道如何将 return 这种功能传递给调用者。我需要添加任何 return 语句吗?我找不到关于它的例子(如果有人有任何例子,我想我可以用这些例子自己弄清楚代码)?

提前感谢您的帮助,非常感谢。

readDatafindMiddleAgep指向main中的man[3]
readData 中可以直接填充数组。检查scanf的return是个好习惯。如果扫描姓名和年龄,它将 return 2. return 为 1、0 或 EOF 表示有问题。
findMiddleAge 中确定 p[0].agep[1].agep[2].age 的中间值和 return 中哪个是正确的。

#include <stdio.h>

typedef struct {
    char name[20];
    int age;
} Person;

void readData(Person *p);
Person findMiddleAge(Person *p);

int main()
{
    Person man[3] = { { "", 0}}, middle = { "", 0};

    readData(man);
    middle = findMiddleAge(man);
    printf("findMiddleAge(): %s %d\n", middle.name, middle.age);
    return 0;
}

void readData(Person *p)
{
    printf("Enter person 1: \n");
    scanf("%19s %d", p[0].name, &p[0].age);
    printf("Enter person 2: \n");
    scanf("%19s %d", p[1].name, &p[1].age);
    printf("Enter person 3: \n");
    scanf("%19s %d", p[2].name, &p[2].age);
}

Person findMiddleAge(Person *p)
{
    //figure out which is the middle value of
    //p[0].age
    //p[1].age
    //p[2].age
    return p[1];//or p[0] or p[2]
}

在一行中你有两个问题:

p = &man
  1. 您将指针分配给作为 UB 的局部变量(并在函数 return 之后取消引用它)。
  2. 您分配了局部指针 p 并且此分配没有任何效果(因为 p 在函数 returns 时停止存在)。要修改指针本身,您需要将指针传递给指针。
void readData(Person **p) 
{
    /* ... */
    *p = newpvalue;
}

我相信你的代码中还有更多类似的问题。我建议专注于 C 基础知识(作用域、变量、指针等)