说明:
在学习UI高级知识之前,将利用最近十来天的时间回顾一下C语言,主要按照《C程序设计(谭浩强版)》来回顾。
整理一些知识点(不是细节,知识个人觉得较重要或易忘的)以及挑一些课后题目或经典习题编写代码练习。
第9章 用户自己建立数据类型
1、结构体:用户自己建立由不同类型数据组成的组合体的数据结构
为了更加直观的感受知识点,将各种知识点以代码及注释的形式说明。
#include <stdio.h>
struct Date {
int month;
int day;
};
struct Student {
char name[20];
int age;
char sex;
struct Date Birthday; //成员可以属于另一个结构体
}student1 = {"Nong Chaozhe",21,'M',{2,18}}; //定义结构体并初始化
int main(int argc, const char * argv[]) {
struct Student student2 = student1; //同类结构体可以相互赋值
int age = 10; //结构体中成员们可以与程序中变量名相同,但不代表同一个对象
printf("student1:%s,%d岁,%c,%d月%d日\n",student1.name,student1.age,student1.sex,student1.Birthday.month,student1.Birthday.day); //输出数据
//结构体数组
struct Date festival[3] = {1,1,{5,1},10,1}; //结构体数组,逗号,按顺序赋值,加不加括号都可以
printf("元旦:%d.%d\n",festival[0].month,festival[0].day);
//结构体指针
struct Student *p = NULL;
p = &student2;
printf("student2:%s,%d岁,%c,%d月%d日\n",(*p).name,p->age,p->sex,(*p).Birthday.month,(*p).Birthday.day); //指针变量两种访问成员变量的方式,还有一种就是student2.name
//指向结构体数组的指针
struct Date *p1 = NULL;
for (p1 = festival; p1 < festival+3; p1++) {
printf("节日:%d.%d\n",p1->month,p1->day);
} //p1+1意味着p1所增加的值为结构体数组festival一个元素所占的字节,指向festival[1];
// 结构体变量或结构体变量的指针作函数参数
// 与之前的数组等等都类似,不作累述
printf("%lu\n",sizeof(student1));
// 根据结构体情况占37个字节 (20+4+1+(2*4)=33),但是结果是36
// 因为计算机对内存的管理是以“字”为单元的(一般4个字节1个字)。如果一个字只存放一个字符占一个字节,但该字中得其他3个字节不会接着存放下一个数据,而会从下一个字开始存放,因此得到的不是33,而是36。结果必然是4的倍数。
return 0;
}
output:
student1:Nong Chaozhe,21岁,M,2月18日
元旦:1.1
student2:Nong Chaozhe,21岁,M,2月18日
节日:1.1
节日:5.1
节日:10.1
36
2、共用体/联合:使几个不同的变量共享同一段内存的结构
为了更加直观的感受知识点,将各种知识点以代码及注释的形式说明。
#include <stdio.h>
union Data {
int i;
char ch;
float f;
}a = {97}; //可以在声明类型同时定义变量,对第一个成员初始化
//错误!:a = {1,'a',1.5} 不能同时初始化3个成员
//共用体是同一内存段用来存放几种不同类型的成员,但每一瞬间只能存其中一个成员,而不是同时存放几个,重复情况下后赋值会覆盖前者
int main(int argc, const char * argv[]) {
printf("%d\n",a.i); //输出整数97
printf("%c\n",a.ch); //输出字符‘a’
printf("%f\n",a.f); //输出实数0.0000
// 初始化97赋值给a.i,按整数型是存储在变量单元中,最后一个字节是“01100001”。上面三种输出只是对变量单元内的东西按照不同形式输出而已。
union Data b = {.ch = 'A'}; //也可以对指定成员进行初始化
b.f = 1.5;
b.i = 121;
printf("%c\n",b.ch); //输出的不是‘A’,而是最后存入的121对应的ASCII值
b = a; //同类型的共用体变量互相赋值
printf("%p,%p,%p,%p\n",&a,&a.i,&a.ch,&a.f); //4个地址相同
printf("%lu\n",sizeof(a)); //共用体变量所占的内存长度为最长的成员的长度
return 0;
}
output:
97
a
0.000000
y
0x100001018,0x100001018,0x100001018,0x100001018
4
3、枚举:把可能的值一一列举出来,变量的值只限于列举出来的值的范围内。enum开头。
为了更加直观的感受知识点,将各种知识点以代码及注释的形式说明。
#include <stdio.h>
typedef enum {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}Weekday; //利用typedef定义新类型名
int main(int argc, const char * argv[]) {
Weekday date = Monday;
// 等价于 date = 0;因为每一个枚举元素都代表一个整数,C语言编译按定义时的顺序默认他们的值为0,1,2,3,4,5……
printf("%d\n",date); //输出‘0’
// 既然是数字,那么不同的枚举元素之间是可以比较=,>,<,==等等的
if (date == Monday) {
printf("Yes\n");
}
return 0;
}
output:
0
Yes