C语言复习——结构体


Struct 结构体

结构体是C语言中的一个很重要的东西,也算是较为高级进阶的内容了(大神勿喷)。尤其是在学习数据结构,数据结构在C语言中的描述就是写一个个结构体,定义自己的结构。

因为C语言不是面向对象的,不能写类。但是在某种程度上结构体就是C语言中的类。可想其重要程度(学C++、Java天天都在写类QAQ)。但是老师在教学的时候由于教学要求,没有讲到很深入,导致现在还有很多概念不清楚,今天复习了一下,仅供个人参考,如有错误,欢迎批评指正,共同进步。


struct  date
{
    int day;
    int month;
};

#include <cstdio>
#include <cstdlib>

struct point
{
    int x;
    int y;
};

struct point* getStruct(struct point*);
void output(struct point);

int main(int argc, char **argv)
{
    printf("Programming Begin\n");
    struct point z = {0, 0};
    getStruct(&z);
    output(z);
    # 这样很方便,直接给将一个函数传递到另一个函数中
    output(*getStruct(&z));
    # Get 骚操作有木有,给函数复制,完全没问题,小白肯定看不懂
    *getStruct(&z) = (struct point){1, 2};
    output(z);

    return 0;
}

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);
}

void print(const struct point *p)
{
    printf("%d %d ", p->x, p->y);   
}

错误案例:

// 这样写是错误的,因为p是形参,在main函数中并不会改变原来的值
void getStruct(struct point p)
{
    scanf("%d %d", &p.x, &p.y);
}
void output(struct point p)
{
    printf("%d "%d", p.x, p.y);
}

typedef

C原本的方式定义结构体变量,每次都要在前面写上一个struct,见上面point结构体。这样非常的麻烦。typedef能够帮上忙。

typedef struct ADate 
{
    int month;
    int day;
    int year;
} Date;
# 这样在初始化一个Date类型的变量的时候就可以直接写了(如下),而不用写struct Date aDay.
# 注意这个地方在C++中是改了的,C++不用typedef也可以直接写。因为struct在C++中也是一种类, 比较特殊的类

Date aDay;
# 但是typedef还有很多其他的用法,以及其与#define的区别,这里不细说了
typedef long int64_t;
int64_t a = 10000000;

Union

联合是C中一个比较有特色的东西,见到的不太多(嗯,笔者见识少)。这里记录一下,教程来自浙江大学翁恺老师《C语言程序设计进阶》,感兴趣的同学可以亲自去看一下。

这里介绍Union 的一个有趣的用法:

#include <stdio.h>

typedef union
{
    int i;
    char ch[sizeof(int)];
} CHI;

int main(int argc, char **argv)
{
    CHI chi;
    int i;
    chi.i = 1234;
    for (i = 0; i< sizeof(int);i++)
    {
        printf("%02hhX", chi.ch[i]);
    }
#   printf("Hello\n"); 测试用
    printf("\n");
    return 0;
}

上面这个程序打印出1234在计算机中的16进制存储方式。我的结果是FFD2040000.不同计算机的结果可能不一样,不过大部分应该是这个结果啦。这里看的出来,我的计算机是小端存储的,也就是位权较低的位存储在前面。

正常1234的十六进制表示是04D2。这里显示的是D2在前面,04在后面,可见是小端。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值