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在后面,可见是小端。