结构体—初阶

    结构体(struct)在C语言中用于处理多个单一数据组成的数据集合。在复杂的数据处理中,结构体是必不可少的。

1. 结构体声明

      struct 结构体名{

      数据类型1  结构体成员1;

      数据类型2  结构体成员2;

      .....

      };

  eg :

 struct Student {              
            char name[20];
            int age;
            char sex[3];  
            char id[20];    
            };//分号不能丢

  

这这个结构体包含了4个元素,数据类型名为 struct Student ,而不是Student。 
 

2. 定义结构体变量

    声明了结构体类型后便可以使用结构类型定义结构体变量。 

   (1)声明结构体类型,并定义结构体变量

      eg :

struct Student {
   char name [];
   int age;
   char gender;
   char num[];
}; 
struct Student s;    // 定义结构体变量s

      (2) 不声明结构体类型,直接定义结构体变量

    eg : 

struct {
   char name [];
   int age;
   char gender;
   char num[];
} S;   // 定义了结构体变量 s 

    这种形式并没有结构体数据类型,因此无法向第一种形式那样再其他语句中多次定义结构体变量。如果要声明另一个同一类型的结构体变量,必须将这个结构体的内容全部写上。

    (3)使用 typedef得到简化的结构体类型名,再定义结构体变量。

typedef struct Student {
   char name [];
   int age;
   char gender;
   char num[];
} Student;   // 定义了结构体变量 

   这样可以像其他数据类型一样定义变量。

3. 结构体成员访问

    使用成员访问操作符(.)访问结构体成员。. 是二元操作符。

  eg : 

Student . name;
Student . age;
Student . sex;

使用实例:

/* 结构体的使用 */
#include <stdio.h>
#define SIZE_NAME 30

typedef struct _per_infor {
	char name[SIZE_NAME];
	int age;
	char gender;
} per_infor;

int main(void) {
	per_infor raul;
	per_infor joe;

	printf("Please input Raul's information:\n");
	gets(raul.name);
	scanf("%d %c", &raul.age, &raul.gender);			/* .优先级比&高 */

	printf("raul.name\t= %s\n", raul.name);
	printf("raul.age\t= %d\n", raul.age);
	printf("raul.gender\t= %c\n", raul.gender);

	joe.age = 31;
	printf("joe.name\t= %s\n", joe.name);
	printf("joe.age\t\t= %d\n", joe.age);
	printf("joe.gender\t= %c\n", joe.gender);

	return 0;
}

4. 结构体数组

    结构体数组表示每个人数组元素都是一个结构体类型的数据,它们都分贝包括各个成员项。

    定义结构体类型:

    struct 结构体名
         {

        成员列表          

         } 数组名 [数组长度];

     声明结构体

     结构体类型  数组名 [数组长度];

    eg : 有三个候选人,每个选民只能投票一人,要求编辑一个统计选票的程序,先后输入被选人的姓名,最后输出各个人的得票结果。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Person
{
	char name[20];
	int count;
}leader[3] = {"li",0,"wang",0,"zhao",0};

int main(){
	int i, j;
	char leader_name[10];
	for (i = 0; i < 10; i++) {
		scanf("%s", leader_name);
		for (j = 0; j < 3; j++) {
			if (strcmp(leader_name, leader[j].name) == 0) {
				leader[j].count++;
			}
		}
	}
	printf("结果\n");
	for (i = 0; i < 3; i++) {
		printf("%s: %d \n", leader[i].name, leader[i].count);
	}

	return 0;
}

运行结果:

li li li li li zhao zhao zhao wang zhao
结果
li: 5
wang: 1
zhao: 4
请按任意键继续. . .

5. 结构体指针

    定义:  指向结构体变量的指针。

    struct Student * p;

    (*)p. num;  等价于 p -> num;

  

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

struct Student {
	int num;
	char name[10];
	char sex;
	float score;
};

int main() {
	struct Student stu;
	struct Student *p;
	p = &stu;
	stu.num = 1010;
	strcpy(stu.name, "Lilin");
	stu.sex = 'M';
	stu.score = 89.5;
	printf("num:%d  name:%s  sex:%c  score:%f \n", 
		   p->num, p->name, p->sex, p->score); // 使用指针访问结构体内容并打印
	return 0;
}


运行结果:
num:1010  name:Lilin  sex:M  score:89.500000
请按任意键继续. . .

另; 如果 p 指向一个结构体变量 stu, 一下三种方式等价:
      (1)stu. 成员名;

      (2)(*p). 成员名;

       (3)p -> 成员名;

发布了21 篇原创文章 · 获赞 2 · 访问量 871

猜你喜欢

转载自blog.csdn.net/weixin_44132627/article/details/103616329