在声明全局变量的时候前面加关键字extern可以让当前源文件使用其他源文件中声明的全局变量
使用static关键字声明的全局变量叫做静态全局变量,它的作用域被限制在声明它的那个源文件内部。
static也可以用来声明函数,效果和静态全局变量一样
Makefile用来完成程序编译过程的管理,make工具使用Makefile文件完成管理工作。
结构体可以用来把多个不同类型的变量合并成一个整体,使用方法如下
struct student {
int age;
char gender;
float heigt;
};
其中student表示结构体名称,大括号内部是子变量声明。结构体声明不会创建新变量,所以不能进行初始化。
结构体使用方法如下
struct student student;
其中struct student表示结构体数据类型,后面的student表示结构体变量名称。这里可以使用类似数组的初始化语法进行初始化。
typedef关键字用来给数据类型起别名,只能使用typedef关键字
如果希望在两个函数之间传递一个结构体变量,则应该使用结构体变量的地址作为参数或返回值。
一个变量的地址应该是它自身大小的整数倍,double类型的变量地址是4的整数倍。我们把这个规律叫做数据对齐。
一个结构体变量内部各子变量之间可能会存在空隙,这是由数据对齐造成的。
一个结构体变量的大小一定是内部最大子变量大小的整数倍,double类型的子变量大小按照4处理。这会造成结构体变量最后出现浪费的字节,这叫做补齐。
使用位域可以节省结构体所占空间的大小,方法如下
typedef struct {
int value:3;
int value2:3;
} s1;
其中3表示占3个二进制位
使用了位域的子变量没有地址
最高数位存储在最小地址的字节中叫大端存储方式
最小数位存储在最小地址的字节中叫小端存储方式
枚举类型可以把一组名称转换成整数,从0开始。使用方法如下
enum {CHUN, XIA, QIU, DONG};
//01main.c
#include <stdio.h>
#include "01mul.h"
extern int result;
int main() {
mul(2, 4);
printf("mul(2, 4)是%d\n", result);
return 0;
}
//01mul.c
#include "01mul.h"
int result;
void mul(int value, int value1) {
result = value * value1;
}
//01mul.h
#ifndef __01MUL_H__
#define __01MUL_H__
void mul(int, int);
#endif //__01MUL_H__
//02struct.c
/*
结构体练习
*/
#include <stdio.h>
/*struct student {
int age;
char gender;
float height;
};
typedef struct student student;*/
typedef struct {
int age;
char gender;
float height;
} student;
int main() {
/*int age = 0;
char gender = 0;
float height = 0.0f;*/
/*struct student {
int age;
char gender;
float height;
} student;*/
//struct student student;
student stu = {20, 'F', 1.70f};
printf("请输入年龄,性别和身高:");
scanf("%d %c %f", &stu.age, &stu.gender, &stu.height);
printf("年龄是%d,性别是%c,身高是%g\n", stu.age, stu.gender, stu.height);
return 0;
}
//03type.c
/*
typedef练习
*/
#include <stdio.h>
//#define PINT int*
typedef int* PINT;
int main() {
int value = 0;
PINT p_value = &value, p_value1 = &value;
printf("*p_value是%d\n", *p_value);
printf("*p_value1是%d\n", *p_value1);
return 0;
}
//04rank.c
/*
结构体练习
*/
#include <stdio.h>
typedef struct {
int chinese;
int math;
int english;
} student;
void read(student *p_stu) {
printf("请输入三个成绩:");
scanf("%d %d %d", &p_stu->chinese, &p_stu->math, &p_stu->english);
}
void print(student *p_stu) {
printf("语文成绩是%d,数学成绩是%d,英语成绩是%d\n", p_stu->chinese, p_stu->math, p_stu->english);
}
int main() {
student stu;
read(&stu);
print(&stu);
return 0;
}
//05sizeof.c
/*
对齐,补齐练习
*/
#include <stdio.h>
typedef struct {
char ch;
char ch1;
int value;
} s1;
typedef struct {
char ch;
int value;
char ch1;
} s2;
int main() {
printf("结构体大小是%d\n", sizeof(s1));
printf("结构体大小是%d\n", sizeof(s2));
return 0;
}
//06bit.c
/*
位域练习
*/
#include <stdio.h>
typedef struct {
int value:3;
int value2:3;
} s1;
typedef struct {
short value:3;
short value2:3;
} s2;
int main() {
s1 s;
printf("sizeof(s1)是%d\n", sizeof(s1));
printf("sizeof(s2)是%d\n", sizeof(s2));
//printf("&s.value2是%d\n", &s.value2);
return 0;
}
//07union.c
/*
联合练习
*/
#include <stdio.h>
/*union u1 {
char ch[2];
int value;
};
typedef union u1 u1;*/
typedef union {
char ch[2];
int value;
} u1;
int main() {
printf("联合的大小是%d\n", sizeof(u1));
u1 u;
u.value = 0x12345678;
if (0x78 == u.ch[0]) {
printf("小端\n");
}
else {
printf("大端\n");
}
return 0;
}
//08enum
/*
枚举练习
*/
#include <stdio.h>
int main() {
enum {CHUN, XIA, QIU = 6, DONG};
enum {NAN, NV};
printf("CHUN是%d\n", CHUN);
printf("DONG是%d\n", DONG);
printf("NAN是%d\n", NAN);
return 0;
}
//Makefile
a.out : 01main.o 01mul.o
gcc 01mul.o 01main.o
01main.o : 01main.c 01mul.h
gcc -c 01main.c
01mul.o : 01mul.c 01mul.h
gcc -c 01mul.c
clean :
rm *.o a.out