结构和其他数据形式
1.结构的样子:
struct student{
char name[20];
char number[20];
int n;
double value;
};
int main()
{
struct student p1,p2;
...
return 0;
}
- 结构体的声明
结构体是由关键字struct 来声明的,它就像是一个模板,里面封装了相应的数据。 - 访问结构成员
其中p1、p2都是point里面有name[ ]、number[ ]、n、value的值。
用变量访问结构成员,用.来调用。如:p1.n、p2.value、p1.name[ i ]等。 - 还可以声明结构数组
struct student{
char name1[25],name4[25],name3[25],name2[25];
};
int main()
{
struct student a[100];
for(int i=0; i<10; i++){
scanf("%s %s %s",a[i].name1,a[i].name2,a[i].name3);
}
for(int i=10-1; i>=0; i--){
printf("%s %s %s\n",a[i].name1,a[i].name2,a[i].name3);
} //逆序输出
return 0;
}
输入样例: zhangsan haha 01
lisi haha 02
wangwu haha 03
输出样例: wangwu haha 03
lisi haha 02
zhangsan haha 01
2.结构指针:
声明和初始化结构指针:
#include <stdio.h>
struct names {
char first[100];
char last[100];
};
struct guy {
struct names handle; //嵌套结构:结构中包含了另一个结构
char favfood[100];
char job[100];
float income;
};
int main()
{
struct guy fellow[2] = {
{{"Ewen", "Villard" },
"grilled salmon",
"personality coach",
68112.00
},
{{ "Rodney", "Swillbelly" },
"tripe",
"tabloid editor",
432400.00
}
};
struct guy *him; //指向结构的指针
printf("adress #1: %p #2: %p\n",&fellow[0], &fellow[1]);
him = &fellow[0]; //告诉编译器该指针指向何处
printf("pointer #1: %p #2: %p\n",him, him + 1);
printf("him->income is $%.2f: (*him).income is $%.2f\n",
him->income, (*him).income);
him++; //指向下一个结构
printf("him->favfood is %s: him->handle.last is %s\n",
him->favfood, him->handle.last);
return 0;
}
该程序的输出结构如下:
adress #1: 0x7fff5fbff820 #2: 0x7fff5fbff874
pointer #1: 0x7fff5fbff820 #2: 0x7fff5fbff874
"him->income is $68112.00: (*him).income is $68112.00
him->favfood is tripe: him->handle.last is Swillbelly
struct guy *him;
首先是关键字struct,其次是结构标记guy,然后是一个星号‘ * ’,其后跟着指针名。这个语法和其他指针声明一样。
该声明并未创建一个新的结构,但是指针him现在可以指向任意现有的guy类型的结构。例如,如果barney是guy类型的结构变量,可以这样写:
him = &barney;
和数组不同的是,结构变量名并不是结构变量的地址,因此要在结构变量名前面加上&运算符。
在本例中,fellow是一个结构数组,这意味着fellow[0]是一个结构。所以,要让him指向fellow[0],可以这么写:
him = &fellow[0];
多说无益,通过这道题可以充分理解结构体指针联系函数的运用: https://pintia.cn/problem-sets/1337734387166953472/problems/1337735292742037504.
3.链式结构
结构的一个重要用途就是创建新的数据形式。有很多的一些数据结构可以更有效的解决一些特定的问题,数据结构如:队列、二叉树、堆、哈希表、图标。很多数据结构都是链式结构,即每个结构都包含一两个数据项和一两个指向同类型结构的指针。
4.枚举类型
可以用枚举类型声明符号类型来表示整型常量。用关键字enum,enum常量是int类型的。枚举类型的用途是在某些时候提高程序的可读性。
enum spectrum {red, orange, yellow, green, blue, violet};
enum spectrum color;
实际上red、orange都是int类型的常量,red=0,后面的都逐个递增。
也可以为枚举常量指定整数值。
enum levels{low=100, medium=500, high= 2000};
5.typedef 简介
typedef用于为某一特定类型定义别名。用法很简单。
typedef unsigned char BYTE;
可以用typedef来为结构命名,此时可以省略结构标签:
typedef struct {
float imag;
float real;
} COMPLEX;