翁恺 程序设计进阶C语言笔记-结构类型

结构类型

枚举

枚举是用户定义的数据类型,用来表示依此排列的常量(常量类型只能是 int,常量大小是从0到n)

枚举类型里的名字通常不是真的使用,要使用的是大括号里的常量名字。定义枚举的意义就是给这些常量定义一些名字

enum colors {red,yellow,green};   //red=0...
void f(enum color c);
int main()
{
    enum color t =red;   //enum color作为一个整体,是一种数据类型,相当于int t =red,告诉编译器这个red是color这个枚举类型
    f(t);
    return 0;
}

void f(enum color c)
{
    printf("%d\n",c);
}

//枚举也可以自定义常量
enum colors{RED,YELLOW,GREEN=5};   //此时RED=0,YELLOW=1,GREEN=5

结构体

自定义的复合的数据类型,在一个数据类型中有多种不同的类型

结构体放在所有函数的外面时,可以被所有函数使用;放在某个函数里面时,只能在那个函数的内部使用。

  • 声明结构体
//定义方式1
struct point{
    int x;
    int y;
};   //别忘了最后的分号
struct point j;    //变量j的数据类型是point

j.x = 1;
j.y = 2;    //给j中的变量赋值

//定义方式2
struct point{
    int x;
    int y;
}j;     //将上述的两步写在了一起

//方式3
struct {
    int x;
    int y;
}j;        //无名结构体,这样写就不能用此结构体来定义新变量了,仅适用于只想使用一次的结构体

//结构体赋初值
struct point j = {100,2};   //j.x=100,j.y=2;
struct point j = {.x=100,.y=2}; //如果没有指定的值会默认0

p1 = (struct point){10,2};  //强制类型转换 相当于初始化p1.x=10..
p2=p1;  //初始化p2.x=10..

//定义一个指向结构体的指针
struct point *p_point = &j;       //定义指针时给出指针的类型。

//定义结构类型
typedef struct _point{
	int x,y;
}Point;

Point j;    //将结构他定义为一个新的类型,就不用每次都打一个struct了
  • 结构体可以作为参数传入函数:在函数内部新建一个结构变量,将传入的结构变量复制进去,这与数组完全不同(数组是传入的数组就是个指针,跟原数组一样)

结构体也可以作为返回值返回。

//想要使函数中对传入结构体的值进行保存
 //返回结构体
struct point{
    int x;
    int y;
}; 

struct point getStruct(void){
    struct point p;  //结构体定义在函数外,所以在函数体内可以用
    scanf("%d",&p.x);
    scanf("%d",&p.y); 
    return p;
}

int main(void)
{
    struct point y={0,0};
    y = getStruct();
}

  //传入指针 
//更加有效,因为上述方法是传值,要为新的函数内的结构体里的结构类型开辟一个内存空间,然后将传入的参数一个个复制过去,占空间耗时间,所以大的结构体不推荐传值
struct point *p = &j;

(*p).x=100;   //*p就是j 相当于j.x
p->x=100;    //两者等价,->就是结构变量中的成员,箭头的左边只能是指针!

struct point getStruct(struct point *p){
    scanf("%d",&p->x);
    scanf("%d",&p->y); 
    return p;    //返回指针,好处:可以在其它函数中调用这个返回值
}

void output(struct point p)
{
    printf("%d,%d",p.x,p.y);
}

output(*getStruct(&y)); //y是一个point类型的结构体,&y是结构体地址,相当于指针的值,getStruct(&y)是返回的那个指针p,*p就是取结构体里的值
  • 结构体数组
struct point studentsPoint[3] = {
    {99,100}, {60,50}, {70,85}
}; //定义了一个结构体数组

printf("%d,%d",studentsPoint[0].x,studentsPoint[0].y); //就会显示99和100
  • 结构体的嵌套
struct rectangle {
    struct point point1;
    struct point point2;
}

struct rectangle rec;
rec.point1.x=1;
rec.point2.y=2;

//嵌套再加数组
struct rectangle rects[]{
    { {1,0},{2,1} },
    { {2,2},{2,3} }
};
rects[0].point1.x  //就是1
rects[0].point1.y  //就是0  就是最里面那个小括号,右边那个小括号就是rects[0].point2.x和Y
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值