C-将结构指针传递给函数

时间:2020-02-23 14:31:58  来源:igfitidea点击:

在本教程中,我们将学习将结构指针传递给C编程语言中的函数。

我们在较早的教程之一中了解了如何将结构传递给函数。
因此,我们将使用该想法将结构指针传递给函数。

创建一个结构

在下面的示例中,正在创建一个"学生"结构。

//student structure
struct student {
  char id[15];
  char firstname[64];
  char lastname[64];
  float points;
};

函数声明接受结构指针

以下是接受结构指针的函数声明的语法。

returnType functionName(struct tagName *);

returnType是函数functionName的返回类型。
如果函数不返回任何东西,则将其设置为" void"。
该函数采用结构" tagName"指针。

在下面的示例中,我们正在创建两个函数声明,它们声明了学生结构的地址。

void getDetail(struct student *);
void displayDetail(struct student *);

创建一个结构变量数组

现在,我们将通过编写以下代码来创建一个学生结构变量数组。

//student structure variable
struct student std[3];

因此,我们创建了一个大小为3的学生结构变量数组,以存储三个学生的详细信息。

我们可以如下表示" std"数组变量。

现在,我们将编写完整的代码,这将帮助我们获取学生数据,然后显示它们。

完整的代码

#include <stdio.h>
    
//student structure
struct student {
  char id[15];
  char firstname[64];
  char lastname[64];
  float points;
};

//function declaration
void getDetail(struct student *);
void displayDetail(struct student *);

int main(void) {
  
  //student structure variable
  struct student std[3];
  
  //get student detail
  getDetail(std);
  
  //display student detail
  displayDetail(std);
  
  return 0;
}

//function definition

void getDetail(struct student *ptr) {

  int i;

  for (i = 0; i < 3; i++) {
    printf("Enter detail of student #%d\n", (i + 1));
    printf("Enter ID: ");
    scanf("%s", ptr->id);
    printf("Enter first name: ");
    scanf("%s", ptr->firstname);
    printf("Enter last name: ");
    scanf("%s", ptr->lastname);
    printf("Enter Points: ");
    scanf("%f", &ptr->points);
    
    //update pointer to point at next element
    //of the array std
    ptr++;
  }

}

void displayDetail(struct student *ptr) {

  int i;

  for (i = 0; i < 3; i++) {
    printf("\nDetail of student #%d\n", (i + 1));
    
    //display result via ptr variable
    printf("\nResult via ptr\n");
    printf("ID: %s\n", ptr->id);
    printf("First Name: %s\n", ptr->firstname);
    printf("Last Name: %s\n", ptr->lastname);
    printf("Points: %f\n", ptr->points);
    
    //update pointer to point at next element
    //of the array std
    ptr++;
  }

}
Enter detail of student #1
Enter ID: s01
Enter first name:  
Enter last name: 
Enter Points: 8
Enter detail of student #2
Enter ID: s02
Enter first name: John
Enter last name: Doe
Enter Points: 7
Enter detail of student #3
Enter ID: s03
Enter first name: Jane
Enter last name: Doe
Enter Points: 9

Detail of student #1

Result via ptr
ID: s01
First Name: 
Last Name: 
Points: 8.000000

Detail of student #2

Result via ptr
ID: s02
First Name: John
Last Name: Doe
Points: 7.000000

Detail of student #3

Result via ptr
ID: s03
First Name: Jane
Last Name: Doe
Points: 9.000000

我们可以如下表示" std"结构数组变量和函数参数。

注意!在给定的图像中,我们显示了" displayDetail()"函数。
getDetail()函数也将类似。

注意点!

每个std元素占用147个字节的内存,我们可以表示如下。

成员数据类型大小
idchar15个字节
firstname字符64字节
lastname字符64字节
Points浮点数4个字节

当我们将std变量作为参数传递给getDetail()displayDetail()函数时,实际上是在传递变量的地址,即std的起始地址。

然后将" std"的起始地址分配给" ptr"变量,我们将使用它来访问学生结构的成员。