C-指针和结构数组

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

在本教程中,我们将学习使用C编程语言将指针与结构变量数组一起使用。

因此,在上一教程中,我们学习了如何为结构变量创建指针。

现在让我们继续创建一个结构变量数组,并通过指针变量使用它。

创建一个结构变量数组

在下面的示例中,我们将考虑在上一教程中创建的"学生"结构,并创建一个大小为3的学生结构变量" std"数组,以容纳三个学生的详细信息。

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

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

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

创建结构的指针变量

现在,我们将创建一个指针变量,该变量将保存学生结构变量std的起始地址。

//student structure pointer variable
struct student *ptr = NULL;

//assign std to ptr
ptr = std;

注意! " std"是一个数组变量,数组变量的名称指向内存位置,因此,我们将其分配给结构指针变量" ptr"。

通过指针访问结构数组变量的每个元素

为此,我们首先将指针变量" ptr"设置为指向" std"变量的起始存储位置。
为此,我们编写" ptr = std;"。

然后,我们可以使用增量运算符" ptr ++"来递增指针变量,以使指针指向结构数组变量的下一个元素,即从str [0]到str [1]。

因为有3个学生,所以我们将循环3次。
因此,我们将指针变量增加两次。
第一个增量会将指针" ptr"从std [0]移动到std [1],第二个增量会将指针" ptr"从std [1]移动到std [2]。

为了重置指针变量" ptr"以指向结构变量" std"的起始存储位置,我们编写" ptr = std;"。

完整的代码

#include <stdio.h>

int main(void) {
    
  //student structure
  struct student {
    char id[15];
    char firstname[64];
    char lastname[64];
    float points;
  };
  
  //student structure variable
  struct student std[3];
  
  //student structure pointer variable
  struct student *ptr = NULL;
  
  //other variables
  int i;
  
  //assign std to ptr
  ptr = std;
  
  //get detail for user
  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++;
  }
  
  //reset pointer back to the starting
  //address of std array
  ptr = std;
  
  for (i = 0; i < 3; i++) {
    printf("\nDetail of student #%d\n", (i + 1));
      
    //display result via std variable
    printf("\nResult via std\n");
    printf("ID: %s\n", std[i].id);
    printf("First Name: %s\n", std[i].firstname);
    printf("Last Name: %s\n", std[i].lastname);
    printf("Points: %f\n", std[i].points);
  
    //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++;
  }
  
  return 0;
}
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: Jane
Enter last name: Doe
Enter Points: 9

Enter detail of student #3
Enter ID: s03
Enter first name: John
Enter last name: Doe
Enter Points: 6

Detail of student #1

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

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

Detail of student #2

Result via std
ID: s02
First Name: Jane
Last Name: Doe
Points: 9.000000

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

Detail of student #3

Result via std
ID: s03
First Name: John
Last Name: Doe
Points: 6.000000

Result via ptr
ID: s03
First Name: John
Last Name: Doe
Points: 6.000000

我们可以如下所示在内存中表示" std"数组变量。

注意点!

每个学生数据占用147个字节的内存。

成员数据类型大小
idchar15个字节
名字字符64字节
姓氏字符64字节
points浮点数4个字节

数组大小为3,因此,总共147x3,即441个字节分配给了" std"数组变量。

第一个元素" std [0]"的存储位置从1000到1146。

第二个元素" std [1]"从1147到1293获取内存位置。

第三个元素" std [2]"从1294到1440获得内存位置。

首先,使" ptr"指针变量指向地址1000,该地址是第一个元素" std [0]"的起始地址。

然后向前移动,我们增加指针" ptr ++",因此它指向存储位置1147,即第二个元素" std [1]"的起始存储位置。

同样,在下一次运行中,我们将" ptr"指向内存位置1294,即第三元素" std [2]"的起始位置。

要通过指针访问结构的成员,我们使用->箭头运算符。