黑马程序员——c语言中结构体的使用以及注意事项和实际应用

 

 

 

 

1.结构体和数组的区别

①结构体:结构体可以由多个不同类型的数据构成,可以 包含int double等多种类型
②数组:数组则只能由多个相同类型数据构成

2.结构体的定义
①先定义结构体类型

struct Person
{
int age; //age height name 三个变量可以称之为结构体成员或者属性
double height;
char*name;
}

②根据结构体类型定义结构体变量

struct Person p={20,1.75,"tom"};
p.age=30;
p.name="tim" //对结构体变量重新进行赋值

 

3.结构体内存分析

struct Person // 是定义结构体类型,并没有分配存储空间
{
int age; 
double height;
char*name;
}

②struct Person p={20,1.75,"tom"}; //定义结构体变量才是真正分配存储空间

③结构体所占用的存储空间必须是最大成员字节数的倍数
int类型占用4个字节,char类型占用8个字节,而sizeof(Person)占用的是16个字节(8*2),而不是12个字节(8+4)

4.定义变量方式
①先定义类型,再定义变量,例如上面介绍的
②定义类型同时定义变量 例:

struct student
{
int age;
char *name;
}stu;

③定义类型同时定义变量 

struct //类型无名称此定义方法不能重用
{
int age;
char *name;
}stu;

 

5.指向结构体的指针
①定义: struct student *p;
②利用指针访问成员chengyuan
1>(*p)成员名称
2> p->成员名称

struct student
{
int age;
int no;
}
//结构体变量
struct student stu=(20,1);
//指针变量p将来指向struct student 类型的数据
struct student *p;
//指针变量p指向stu变量
p=&stu;
p->age=30;

输出的三种方式

Ⅰ printf("age=%,no=%d",stu.age,stu.no);
Ⅱprintf("age=%,no=%d",(*p).age,(*p).no);
Ⅲprintf("age=%,no=%d",p->age,p->no); //最常见的方法

例子

 1 /*从键盘输入一大堆字符串,统计A,B,C,D的出现次数,最后出现次数从高到低输出字母和出现次数*/
 2 #include <stdio.h>
 3 
 4 struct test //定义结构体数
 5 {
 6 int p;     //保存字符出现次数
 7 char q;     //保存字符种类
 8 };
 9 struct test array[4];
10 
11 void paixu(struct test *b,int n);//调用定义的函数
12 
13 int main()
14 {
15 
16 int a,b,c,d;    
17 a=b=c=d=0;     //定义abcd四个整形变量,用于存储字符串出现次数,并进行初始化
18 char n[100];
19 printf("输入字符串:\n");
20 scanf("%s",n);     //读取输入的字符串
21 
22 for(int i=0;i<100;i++)     //通过for循环计算a,b,c,d出现的次数
23 {
24 if(n[i]=='a'||n[i]=='A')
25 {
26 a++;
27 }
28 
29 else if(n[i]=='b'||n[i]=='B')
30 {
31 b++;
32 }
33 else if(n[i]=='c'||n[i]=='C')
34 {
35 
36 c++;
37 }
38 else if(n[i]=='d'||n[i]=='D')
39 {
40 d++;
41 }
42 
43 }
44 //对结构体变量赋值
45 array[0].p=a;array[1].p=b;array[2].p=c;array[03].p=d;    
46 array[0].q='a';array[1].q='b';array[2].q='c';array[3].q='d';
47 paixu(array,4);//调用排序函数
48 for(int l=0;l<4;l++)//循环输出显示
49 {
50 
51 printf("%c出现次数为%d\n",array[l].q,array[l].p);
52 }
53 return 0;
54 }
55 
56  
57 
58 void paixu(struct test *b,int n)//创建一个排序函数
59 {
60 int temp;     //定义int类型变量,用于数值交换
61 char temp2;     //定义char类型变量,用于字符交换
62 for(int i=0;i<n;i++)     //for循环遍历
63 for(int j=0;j<n-i;j++)    //将abcd进行降序排序
64 {
65 if (b[j].p<b[j+1].p) 
66 {
67 temp=b[j].p;     //如果前一个字符出现次数小于后一个进行交换
68 b[j].p=b[j+1].p;
69 b[j+1].p=temp;
70 temp2=b[j].q;     //字符种类交换
71 b[j].q=b[j+1].q;
72 b[j+1].q=temp2;
73 
74 }
75 
76 }
77 
78 }

 

posted @ 2015-03-15 08:36  Mr.Zero7  阅读(388)  评论(0)    收藏  举报