C语言基础九

在声明全局变量的时候前面加关键字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




你可能感兴趣的:(c)