如何传递和接收指向结构数组的指针?

时间:2019-06-23 11:34:22

标签: c pointers struct

我以前的问题不是一个好问题,因为我没有得到很好的答案。因此,我决定编辑整个问题,希望可以在此论坛中进行编辑。

所以我有一个结构数组,其结构如下:

struct patient {
    int pictures[2];
    int personal_number;
    char patient_name[FILE_PATIENT_NAMES + 1];
    int num_of_matches;
};

typedef struct patient Patient;

Patient patientregister[5];

我有以下两个功能:

/********* function declaration *********/

Patient *search_patient(Patient patientregister[], int num_of_patients);
Patient *search_by_personaNumber(Patient *matches[],
                                 Patient patientregister[], int num_of_patients);

代码从*search_patient开始,然后转到*search_bu_personalNumber*search_patient内声明了另一种结构数组:Patient matches[5];,其想法是将Patient matches[5];的指针发送到*search_by_personalNumber。然后将其与用户要搜索的匹配项一起返回给*search_patient。我的问题是如何将指向结构数组的指针发送到另一个函数,如何使用该指针填充结构数组并将指针发送回原始函数,在我的情况下是*search_patient

2 个答案:

答案 0 :(得分:2)

您可能会因为使用*search_by_personaNumber*search_patient而感到困惑。它们实际上称为search_by_personaNumbersearch_patient,但返回指向Patient结构的指针

founded_patients相同。此数组不包含10个Patient结构,它包含10个指向Patient结构的指针。

主要问题是您不能从函数返回数组。当您尝试使用founded_patients的返回指针分配search_by_personaNumber时,您将无法获得期望的结果。

请不要为founded_patients分配返回值。由于它已经是一个指针(数组是指向多个值的指针),当您在search_by_personaNumber中传递它时,它将已经被分配了值。

答案 1 :(得分:1)

您的数据结构中有些混乱:成员num_of_matchesPatient结构无关。相反,您应该通过返回search_by_personaNumber中的患者人数来跟踪发现(而不是已发现)患者的数量。

这是您代码的修改版本:

#include <stdio.h>

/*---- Declarations ----*/
typedef struct patient {
    int pictures[2];
    int personal_number;
    char patient_name[FILE_PATIENT_NAMES + 1];
} Patient;

/* patientregister[] is the original array of structures where the patients' data are stored */
Patient *search_patient(Patient patientregister[], int num_of_structs);
int search_by_personaNumber(Patient *found_patients[], int found_max,
                            Patient patientregister[], int num_of_structs);

/*---- Implementation ----*/
int search_by_personaNumber(Patient *found_patients[], int found_max,
                            Patient patientregister[], int num_of_patients) {
    int personal_nr,
    int matched_patients;

    printf("\nEnter personal number to search for: ");
    if (scanf("%d", &personal_nr) != 1)
        return 0;

    matched_patients = 0;
    for (int j = 0; j < num_of_patients && matched_patients < found_max; j++) {
        if (patientregister[j].personal_number == personal_nr) {
            founded_patients[matched_patients] = patientregister[j];
            matched_patients++;
        }
    }
    return matched_patients;
}

Patient *search_patient(Patient patientregister[], int num_of_patients) {

    Patient *found_patients[10];
    int found_count;
    int choice;

    printf("\nSearch by: personal number(1), name(2) of pic ref.(3)? ");
    if (scanf("%d", &choice) != 1)
        return NULL;

    switch (choice) {
      case 1:
        found_count = search_by_personaNumber(found_patients, sizeof(found_patients) / sizeof(found_patients[0]), 
                                              patientregister, num_of_patients);

        /************FOR DEBUGGING: DOWN HERE AM JUST TRYING TO SEE IF I CAN PRINT 
        THE CONTENTS IN found_patients ************/

        printf("\n");
        printf("  %-20s%-9s%-20s", "Personal number", "Name", "Picture reference\n\n");
        printf("------------------------------------------------\n");

        for (int j = 0; j < found_count; j++) {
            printf(" %7d%18s\t\t%d,%d\n",
                   found_patients[j]->personal_number,
                   found_patients[j]->patient_name);
                   found_patients[j]->pictures[0],
                   found_patients[j]->pictures[1]);
        }
        /************END DEBUGGING ************/
        break;
      case 2:
        break;
      case 3:
        break;
      default:
        printf("Invalid search choice!\n");
        break;
    }
}

您现在应该解决一些重要问题:

  • 关于无效输入该怎么办?
  • 您如何从search_patient返回结果?