C语言学习笔记<七>


程序中不同的函数可以写在不同的.c源文件中。不同的源文件之间使用扩展名为.h 的头文件链接起来。

编写所有头文件时要使用条件编译进行控制,避免被多次编译。

多文件程序编译有两种办法
    1.使用GCC命令对所有.c源文件统一编译。
    2.使用gcc命令对每个单独的.c源文件进行编译,得到以.o作为扩展名的目标文件。最后使用gcc命令把所有目标文件合并成可执行文件。

.c源文件中如果要使用其它源文件中声明的全局变量则需要使用如下方法声明一下。
extern int a;

make工具可以用来进行项目管理,它可以根据记录在Makefile中的要求完成整个编译过程。
//========================================
// 下午
//========================================

结构体可以用来把多个不同类型的变量合并成一个整体。结构体声明方法如下。
struct 结构体名称
 {
     变量声明语句
 };
其中struct 是表示结构体的关键字。在结构体声明中所有的变量声明语句并不会产生新的变量。

结构体可以当成数据类型来使用,并可以声明结构体变量,使用方法如下
struct 结构体名称 结构体变量的名称。

typedef 关键字可以用来给数据类型起别名,它和 #define完全不同。

结构体变量做参数的时候应该使用一个指针变量来替换,这样可以节省空间和时间,如果这个参数只是输入参数则指针声明前面加上关键字 const.

变量的地址必须是变量大小的整数倍,这叫做数据对齐。double变量的地址只需要是4的整数倍就可以了。数据对齐会导致结构体中不同变量之间有空隙,结构体变量的大小并不是其中所有子变量大小之和。

整个结构体变理的大小必须是其中最大变量大小的整数倍,double 变量大小按4个计算,为了保证这一点,有时需要在结构体后面加入一些浪费的字节,这叫做补齐。

声明结构体的时候可以使用位域限制某个子变量所占的二进制位数,所有整数类型变量都可以使用位域。使用位域声明的子变量没有地址。
//==================================================
//晚自习讲考试题
//==================================================
//19.笔试题
continue 和 break 的区别
  1.continue 只用于循环中,
  也可以使用 switch - case,用于跳出

/*============================================
 *名称:结构体练习             功能:无
 *日期:2013-05-10             by:ant
 *备注:strnct 定义结构体,通过指针变量传递结构体参数。
 *=========================================== */
#include<stdio.h>
    struct student//定义一个结构体
    {
        int yu_wen;
        int shu_xie;
        int english;
    };
typedef struct student stu;//定义结构体别名。
void print(const stu *p_stu)
{
    printf("语文成绩是%d\n",p_stu->yu_wen);
    printf("数学成绩是%d\n",p_stu->shu_xie);
    printf("english是%d\n",p_stu->english);
}
int main()
{
    stu cheng_ji = {88,90,92 };
    printf("请输入该学生的成绩,语文 数学 英语");
    scanf("%d%d%d",&cheng_ji.yu_wen,&cheng_ji.shu_xie,&cheng_ji.english);   
    print(&cheng_ji);

return 0;
}
/*===========================================
 *名称:结构体位域练习        功能:无
 *日期:2013-05-10             by:ant
 *备注:
 *========================================== */
#include<stdio.h>
typedef struct
{
    int gender:1;
    int age:6;
}stru1;

int main()
{
    printf("大小是%d\n",sizeof(stru1));



return 0;
}
/*============================================
 *名称:                       功能:无
 *日期:2013-05-10             by:ant
 *备注:
 *======================================== */
#include<stdio.h>
typedef struct
{
    char ch;
    char ch1;
    int value;
}stru1;

typedef struct
{
    char ch;
    int value;
    char ch1;
}stru2;
int main()
{
        printf("%d\n",sizeof(stru1));
        printf("%d\n",sizeof(stru2));//由于对齐产生的空隙,这会比stru1大。



return 0;
}
/*==========================================
 *名称:                       功能:无
 *日期:2013-05-10             by:ant
 *备注:
 *========================================== */
#include<stdio.h>
#include<string.h>
typedef struct
{
    //价格,品牌,数量
    int jia_ge;
    int num;
    char ping_pai[10];
}ku_cen;

void read(ku_cen *p_ku)
{
    printf("请输入商品信息:价格 数量 品牌");
    scanf("%d%d%s",&(p_ku->jia_ge),&(p_ku->num),&(p_ku->ping_pai));
}


int main()
{
    ku_cen ku;
    read(&(ku));
    printf("价格:%d\n 数量: %d\n 品牌: %s\n",ku.jia_ge,ku.num,ku.ping_pai);



return 0;
}
/*=========================================
 *名称:多文件练习              功能:无
 *日期:2013-05-15             by:ant
 *备注:
 *======================================= */
#include <stdio.h>
#include "demo.h"
#include "sub.h"
int main()
{
    printf("%d\n",add(1,5));
    printf("%d\n",sub(1,5));


return 0;
}

sub.c内容如下:

int sub(int a, int b)
{
    return a - b;
}

sub.h内空如下:

int sub(int,int);

demo.c代码如下:

int sub(int a, int b)
{
    return a - b;
}

demo.h头文件代码如下:

int add(int,int);

makefile 文件代码如下:

a.out : 多文件练习.c demo.c sub.c
    gcc -c 多文件练习.c
    gcc -c demo.c
    gcc -c sub.c
    gcc 多文件练习.o demo.o sub.o
原文地址:https://www.cnblogs.com/fanghui/p/3099109.html