//
// main.c
// c中的结构体
//
// Created by admin on 16/4/1.
// Copyright © 2016年 jin. All rights reserved.
//
#include <stdio.h>
// 结构体的基本使用
void test1()
{
// 定义结构体
struct Person
{
char *name;
int age;
char sex;
};
// 初始化一个结构体变量
struct Person p;
// 给结构体变量赋值
p.name = "xiaofang";
p.age = 18;
p.sex = 'w';
printf("%s今年就%i岁了,性别%c\n",p.name,p.age,p.sex);
}
// 结构体复制的多种方式
void test2()
{
// 定义结构体
struct Person
{
char *name;
int age;
char sex;
};
// 定义一个结构体变量
struct Person p;
// 逐个给结构体变量赋值
p.name = "xiaofang";
p.age = 18;
p.sex = 'w';
printf("%s今年就%i岁了,性别%c\n",p.name,p.age,p.sex);
// 定义一个结构体变量
struct Person p1;
// 整体给结构体赋值,顺序要和结构体定义时的成员顺序一致,再强转
p1 = (struct Person){"小明",18,'m'};
printf("%s今年就%i岁了,性别%c\n",p1.name,p1.age,p1.sex);
// 定义一个结构体变量
struct Person p2;
// 使用有个已经定义好的结构体变量来赋值
p2 = p;
printf("%s今年就%i岁了,性别%c\n",p2.name,p2.age,p2.sex);
}
// C编译器将按照n个字节对齐。下面输出Person的内存占用的时候会输出14
#pragma pack(2)
// 结构体内存
void test3()
{
// 定义结构体
struct Person
{
char *name;// 8
int age;
char sex;
};
// 默认会是占内存空间最大的成员的内存的倍数
printf("%lu\n",sizeof(struct Person));// 16
}
struct Person
{
char *name;
int age;
};
// 结构体数组
void test4()
{
int length = 3;
struct Person persons[length];
// 逐个赋值,没有初始化的数组项会被初始化为0
persons[0] = (struct Person){"小芳",18};
persons[1] = (struct Person){"小明",18};
for (int i = 0; i < length; i++) {
printf("%s今年%i岁了\n",persons[i].name,persons[i].age);
}
// 定义数组的同时完成赋值
struct Person persons1[] = {{"小芳",18},{"小明",18},{"小芳2",18}};
// 逐个赋值,没有初始化的数组项存放着垃圾值
for (int i = 0; i < length; i++) {
printf("%s今年%i岁了\n",persons1[i].name,persons1[i].age);
}
}
// 结构体指针
void test5()
{
struct Person person = (struct Person){"小芳",18};
// 定义结构体指针
struct Person *personPointer = &person;
// 通过指针访问结构体
printf("%s今年%i岁了\n",(*personPointer).name,(*personPointer).age);
// 这样也可以访问
printf("%s今年%i岁了\n",personPointer->name,personPointer->age);
}
struct Data
{
int year;
int month;
int day;
};
// 这个结构体有个成员是结构体
struct Employee
{
char *name;
char sex;
struct Data birthday;
struct Employee *employee;// 结构体不能嵌套自己,但是可以嵌套自己类型的指针
};
// 结构体嵌套
void test6()
{
// 初始化
struct Employee employee = {"小芳",'w',{1992,11,11}};
printf("雇员:%s,%c,生日是%i-%i-%i\n",employee.name,employee.sex,employee.birthday.year,employee.birthday.month,employee.birthday.day);
// 对指向自己类型的成员赋值
employee.employee = &((struct Employee){"小明",'m',{1992,12,12}});
printf("雇员:%s,%c,生日是%i-%i-%i,他的下属:%s,%c,生日是%i-%i-%i\n",employee.name,employee.sex,employee.birthday.year,employee.birthday.month,employee.birthday.day,employee.employee->name,employee.employee->sex,employee.employee->birthday.year,employee.employee->birthday.month,employee.employee->birthday.day);
}
// 结构体函数
// 结构体作为参数是值传递
void test7(struct Person person)
{
person.age = 19;
}
// 传递结构体的地址
void test8(struct Person *person)
{
person->age = 19;
}
int main(int argc, const char * argv[]) {
// test6();
struct Person p = (struct Person){"小芳",18};
printf("%s今年%i岁了\n",p.name,p.age);
test8(&p);
printf("%s今年%i岁了\n",p.name,p.age);
return 0;
}
枚举
enum Sex
{
Man,Woman
};
int main(int argc, const char * argv[]) {
enum Sex sex = Man;
switch (sex) {
case Man:
printf("boy\n");
break;
case Woman:
printf("girl\n");
break;
default:
printf("Are you kidding me?\n");
break;
}
return 0;
}