天天看点

C语言结构类型_笔记

C语言结构类型

本篇文章为个人在学习C语言结构类型过程中的笔记和总结,有不足之处还请大神指正。

1.枚举类型

⭐符号常量化:用符号而不是具体的数字来表示程序中的数字,是程序能够简洁、便于阅读

const int red = 0;
const int yellow = 1;
const int green = 2;      

枚举类型可以更加方便的方式定义常量:

枚举类型: 枚举是一种用户定义的数据类型,用关键字 enum 以如下语法来表明

enum 枚举类型名字 {名字0,...,名字n};

enum COLOR {RED. YELLOW, GREEN};

第二行语句创建三个常量,其值按顺序排列,即:RED = 0; YELLOW = 1; GREEN = 2;(也可以单独定义,在初始化的时候赋值)

当需要一些可以排列起来的常量值的时候,定义枚举类型的意义就是给这些常量值名字

  • 枚举量可以作为值
  • 枚举类型可以跟上enum作为类型:

enum COLOR {RED. YELLOW, GREEN};

void function(enum color c){...};

int main(){

enum corlor a = RED;

}

  • 编译时实际上是以整数执行内部运算以及外部输入输出的

枚举的优点:如果有意义上排比的名字,枚举定义比用const int 定义更方便;枚举比宏定义更好,因为枚举有int类型。

2.结构类型

结构类型(结构体)可以使用一个类型来表示多个子类型的集合,其中每一个子类型成为该结构的成员。

结构类型的声明和使用:

struct data {
    type name0;        //type:类型; name:成员名
    type name1;
    ...
};

struct data a;      

上述定义方式在使用时为了方便,常使用typedef进行转义简化,如:

typedef struct data{
    type name;
    ...
}data;    //之后可以使用data来表示struct data类型声明;      

结构类型还有另外的声明方式:

struct {
    type name0;        //type:类型; name:成员名
    type name1;
    ...
}a1,a2;                //a1和a2都是一种无名结构,里面都有成员name0和name1...
//注意:上述的方式仅仅定义了两个变量a1、a2,而没有声明结构类型data!!!
struct data {
    type name0;        //type:类型; name:成员名
    type name1;
    ...
}b1,b2;                //b1和b2都是data类型,里面都有成员name0和name1...
//既定义了变量同时又声明了结构类型      
结构类型可以在函数内/外定义,通常定义在函数外,这样结构类型可以被全局使用。

访问结构成员:

结构一般使用 ‘.’ 运算符和名字访问其成员,例如:

data.name0
data.name1      

结构运算

  • 要访问整个结构,直接用结构变量的名字
  • 对于整个结构可以做赋值、取地址,也可以传递给函数参数
a = (stryct data){1,2};    //假设name0和name1类型为int,那么相当于a.name0=1,a.name1=2;      

结构作为函数参数

  • 整个结构可以作为函数参数传入函数
  • 注意:与普通参数相同,将结构变量作为参数传入函数仅仅是将值传递给了函数,不会对变量的值造成改变和影响!
  • 解决无法返回结构的方案:可以创建一个临时结构变量然后返回,也可以使用结构指针作为参数

指向结构的指针

用 -> 表示指针所指的结构变量中的成员(意义为”所指“)
struct data *getstruct(struct data *p){
    scanf("%d", &p->name0);
    return p;    //这里返回一个指针是为了便于使函数参与其他表达式
}      

结构可以嵌套

指向结构数组的指针

定义: 指针变量可以指向一个结构数组,这时结构指针变量的值是整个结构数组的首地址。结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址。

一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能使它指向一个成员。也就是说不允许取一个成员的地址来赋予它。因此,下面的赋值是错误的

ps=&boy[1].sex;

而只能是: ps=boy; //(赋予数组首地址)

或者是: ps=&boy[0]; //(赋予0号元素首地址)

3.联合类型

联合类型的定义方式和使用方式与结构类型相似

与结构类型的区别是:联合结构所有成员共享内存空间,联合类型的所有成员在同一时刻只能有一个起作用,因此他占用的内存空间是所有成员中最大那个的大小。

总结:
  1. 共用体的空间在某一时刻只有一个成员在起作用。
  2. 共用体变量中的成员是最后一次放入的成员。
  3. 共用体变量不能在定义时赋初值。
  4. 共用体变量不能作为函数的参数或函数值,但可使用指向共用体的指针变量。
  5. 共用体可以作为结构的成员,结构体也可以作为共用体的成员。

继续阅读