黑马程序员——C语言基础——结构体、枚举

时间:2021-12-19 00:23:08

———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———

一、结构体

结构体在IOS开发中是经常用到的数据类型,使用频率不亚于指针,所以是非常重要的一种数据类型,但是结构体用法相对比较简单。

 

1.什么是结构体

实际应用中,我们通常需要由不同类型的数据来构成一个整体形容某个事物,比如有int、char *、double类型组成,c语言专门提供了结构体类型来解决该问题,他允许内部元素是不同类型的。

 

2.结构体的定义

格式:

struct 结构体名{

            类型1  成员1;

            类型2  成员2;

            ……

};

例如:

struct Person{
int age;
char *name;
double weight;
};

3.结构体变量的定义

注意:上面定义的是结构体类型,并不是一个结构体变量,就像char、int一样。

结构体变量的定义:

1>先定义结构体类型再定义变量

struct Person {
int age ;
char *name;
};
struct Person person; // 这里注意:struct不可省略,和Person是一个整体

2>定义结构体类型的同时定义变量

struct Person {
int age;
char *name;
} person; // 这里的person即为变量名

3>直接定义结构体变量,省略类型名

struct  {
int age;
char *name;
} person; // 这种定义方式结构体类型不能够重复使用

4.结构体的注意点

1>不允许对结构体本身递归定义

例如:

struct Person {
int age;
struct Person person; //这是错误写法
};

2>结构体内部可以包含其他结构体类型

例如:

struct Date {
int year;
int month;
int day;
};
struct Person {
int age;
struct Date birthday; // 结构体内部包含其他结构体类型
};

3>结构体定义类型定义时并不分配空间,只有定义属于结构体类型的变量时才会分配空间,就像系统并不会为int类型本身分配空间一样。

4>结构体所占空间

结构体所占空间为其内部所有基本类型的整数倍,

例如

struct Person {
int age;
char *name;
};

在64位编译器下,一个Person类型的变量共占16(8+8)字节

 

5.结构体的初始化

1>结构体赋值,需按结构体内部变量顺序一一赋值

例如:

struct Person {
int age;
char *name;
};
struct Person person = {20,”danDan”};

2>结构体只能在定义变量的同时进行初始化赋值,下面的写法是错误

struct Person person;
person = {20,”danDan”};
但是可以这样赋值:
struct Person person;
person.age = 20; // 对age成员进行赋值
person.name = “danDan”; // 对name’成员赋值

“.”称为成员运算符,它在所有运算符中优先级最高

3>同样,我们也可以使用“.”运算符访问结构体成员

例如:

person.age;

person.birthday.year;

 

6.结构体数组

1>定义

跟结构体变量一样,结构体数组也有3中定义方式:

struct Person {
int age;
char *name;
};
struct Person person[3]; // 这是第一种
struct Person {
int age;
char *name;
} person[3]; // 这是第二种
struct {
int age;
char *name;
}person[3]; // 这是第三种

这三种类型都定义了一个person结构体数组,数组元素个数为3,元素均为struct Person类型。

2>结构体数组的初始化

struct {
int age;
char *name;
} person [3] = {{20,”gouDan”},{21,”maoDan”},{22,”lvDan”}};

 

7.结构体作为函数参数

结构体变量作为函数参数进行传递时,形参的改变并不会改变实参的值。

例如:

typedef struct {
int age;
} Person; // 定义结构体类型
void change(Person person) // change方法的定义
{
printf(“person.age = %d”,person.age);
person.age = 20;
printf(“person.age = %d”,person.age);
}
int main()
{
Person person = {10};
change(person); // 调用change方法
printf(“person.age = %d”,person.age);
return 0;
}
上面代码的输出结果是10 20 10。

8.指向结构体的指针

每个结构体均有自己的存储空间和地址,因此指针也可以指向结构体变量

1>结构体指针变量的定义形式:struct 结构体名称 *指针名称  例如:struct Person *p;

2>访问结构体成员的方式:

结构体变量名.成员名

(* 指针变量名).成员名

指针变量名->成员名

例如;

struct Person {  // 定义结构体类型
int age;
char *name;
};
struct Person person = {20,”gouDan”}; // 定义结构体变量
struct Person *p; // 定义结构体指针
p = &person; // 指针指向变量地址

// 通过三种方式访问变量
printf(“age = %d, name = %s”,person.age,person.name);
printf(“age = %d, name = %s”,(*p).age,(*p).name);
printf(“age = %d, name = %s”,p->age,p->name);

二、枚举

1.枚举的概念

枚举也是C语言的一种基本类型,并不是结构体类型,他可以用于声明一组常数。当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型。比如季节、月份、星期等。

 

2.枚举类型的定义

格式:enum 枚举名{枚举元素1、枚举元素2…};

例如:enum Season {spring,summer,autumn,winter};

 

3.枚举变量的定义

跟结构体类似,枚举也有三种定义变量的方式:

1>先定义枚举类型再定义枚举变量

enum Season { spring,summer,autumn,winter};

enum Season s;

2>定义枚举类型的同时定义枚举变量

enum Season{ spring,summer,autumn,winter}s;

3>省略枚举类型名称

enum { spring,summer,autumn,winter} s;

 

4.枚举使用注意

1>C语言编译器会将枚举元素作为常量处理,成为枚举常量。

2>枚举元素取值决定于各枚举元素的先后顺序。默认情况下,第一个元素为0,后面元素依次加一,与数组下标类似。

所以上面定义的枚举类型四个值为0、1、2、3;

3>可以在定义枚举类型时改变枚举值

例如 enum Season { spring,summer = 4,autumn,winter};

赋值元素之前的元素不变,依然为0,而后面则依次加1,为4、5、6。

4>赋值

enum Season { spring,summer,autumn,winter}s;

s = spring; // 等价于s = 0;