回顾:
1.字符串数组
char *pa[5];
pa[0] -->一个字符串
可以指向 5个字符串
char a[5][10]; 保存一个字符串
用字符的二维数组保存字符串数组
char **ppa;
2. 字符串数组的案例
char *argv[] 命令行传入的参数内容
一个字符串就是一个参数
int argc 记录上面数组的元素个数
3. 程序的编译过程,--> 预处理
预处理掉 源代码中所有#开始的语句和注释
宏 #define
宏变量
宏函数
内置的宏 __DATE__
__TIME__
条件编译
#if #else #endif
#define
#ifndef #else #endif
#ifdef #else #endif
#ifndef //防止头文件交叉引用
#define
//头文件的内容
#endif
#include
<>
"" 查找当前目,在找系统目录
----------------
构建大型程序
多人参与开发,由多个.c文件,如何将多个.c编译成为一个可执行程序?
1.将每个.c文件进行独立编译成为.o
将.c文件关于函数原型的声明及其他公共使用到的声明 放到对应.c文件的头文件中,其他的.c 通过include 将头文件引用,即可对该.c函数的调用.
static 限制外部.c文件使用
extern 符号的具有外部链接特性
2.将所有的.o文件 链接成一个可执行文件
make 项目编译
make 在当前目录找 makefile/Makefile 文件
创建makefile 文件,编写编译规则
一条规则
目标:该目标依赖的文件
[tab]用依赖文件生成目标文件的命令
-------------------------
自定义数据类型 (int float)
结构体
怎么构造自己的类型
vim打开多个文件 vim 文件1 文件2 -p
struct (构造体)
/*
* 描述一个学员信息
*/
//字符串赋值 strcpy
#include#include
intmain(){//1.定义student 类型
structstudent{char name[20];intscore;intage;
}stu1,stu3;//声明了2个student 类型的 变量stu2,stu3
stu1.score = 80;//stu1.name = "李辉";//不可这么赋值 strcpy//strcpy("李辉",stu1.name); 不可以
strcpy(stu1.name,"李辉");
stu1.age= 18;
printf("该学员的姓名=%s\n",stu1.name);
printf("该学员的成绩=%d\n",stu1.score);
printf("该学员的年龄=%d\n",stu1.age);
getchar();return 0;
}
typedef 设定结构体类型的别名
#include#include
intmain(){#if 0
//1.定义student 类型
structstudent{char name[20];intscore;intage;
}stu2,stu3;//声明了2个student 类型的 变量stu2,stu3
#endiftypedefstruct student{ //student 可以省略
char name[20];intscore;intage;
}Student;//struct student stu1 ==>Student stu1//用student 类型 声明变量stu1//struct student stu1;
Student stu1;//使用结构体//[练习]给该学员 赋值姓名 和年龄 然后打印//字符串赋值 strcpy
stu1.score = 80;//stu1.name = "李辉";//不可这么赋值 strcpy//strcpy("李辉",stu1.name); 不可以
strcpy(stu1.name,"李辉");
stu1.age= 18;
printf("该学员的姓名=%s\n",stu1.name);
printf("该学员的成绩=%d\n",stu1.score);
printf("该学员的年龄=%d\n",stu1.age);return 0;
}
/*
* typedef 类型的别名
*/
typedef int int32
uint32 //无符号32整型
typedef unsigned int uint32
typedef struct {
}
#include typedefintINT;
typedef unsignedintuint32 ;intmain(){
INT i= 0;
uint32 i32= 0;
printf("sizeof(INT) = %d\n",sizeof(INT));
getchar();return 0;
}
/*
* 结构体变量的初始化
*/
#include
intmain(){
typedefstruct student{ //student 可以省略
char name[20];intscore;intage;
}Student;
Student stu1={"李辉",0,80};
printf("该学员的姓名=%s\n",stu1.name);
printf("该学员的成绩=%d\n",stu1.score);
printf("该学员的年龄=%d\n",stu1.age);
getchar();return 0;
}
结构体指针
#include
intmain(){
typedefstruct student{ //student 可以省略
char name[20];intscore;intage;
}Student;
Student stu1={"李辉",0,80};
Student* ps = &stu1; //声明一个结构体指针变量 指向stu1
ps->score = 90;
printf("ps->name姓名=%s\n",ps->name);
printf("ps->score成绩=%d\n",ps->score);
printf("ps->age年龄=%d\n",ps->age);
getchar();return 0;
}
/*
* [练习]
* 声明一个Student 类型 (typedef)
* 再声明 一个Student 结构体变量 s 指针变量ps ps指向s
* 通过ps 对 s变量进行赋值 并打印输出s的内容
*
* sizeof(ps) 结果是多少?
* sizeof(s) 结果是多少? 为什么?
* name成员将20改为19后
* sizeof(s) 是多少?
*/
#include
intmain(){
typedefstruct{ //student 可以省略
char name[19];charc1;charc2;intscore;intage;
}Student;//struct student stu1 ==>Student stu1
Student stu1;
Student* ps = &stu1; //声明一个结构体指针变量 指向stu1
printf("sizeof(ps) = %d\n",sizeof(ps)); //4
printf("sizeof(stu1) = %d\n",sizeof(stu1)); //28
printf("sizeof(int) = %d\n",sizeof(int)); //4
printf("sizeof(Student) = %d\n",sizeof(Student)); //28
getchar();return 0;
}
sizeof(ps) = 4
sizeof(stu1) = 32
sizeof(int) = 4
sizeof(Student) = 32
bit对其
结构体变量字节数=所有成员字节数之和?
四字节补齐 ==>4的整数倍
/*
* 结构体应用
* 结构体作为函数的参数,
* 值传递,而不是指针,跟基本类型变量一样
* 跟指针,数组 不一样
* 如果要修改传入的结构体,应该传指针
*
*
* 结构体作为函数的返回值
* 跟普通基本类型一样
*
*/
#include typedefstruct student{ //student 可以省略
char name[20];intscore;intage;
}Student;void func (Student*s);intmain(){
Student stu1={"李辉",30,30};
func(&stu1);
printf("姓名=%s\n",stu1.name);
printf("成绩=%d\n",stu1.score);
printf("年龄=%d\n",stu1.age);
getchar();return 0;
}void func (Student*s)
{
s->age = 18;//return 0;
}
/** 结构体应用
* 结构体作为函数的参数,
* 值传递,而不是指针,跟基本类型变量一样
* 跟指针,数组 不一样
* 如果要修改传入的结构体,应该传指针
*
*
* 结构体作为函数的返回值
* 跟普通基本类型一样
**/#include#includetypedefstruct student{ //student 可以省略
char name[20];intscore;intage;
}Student;//struct student stu1 ==>Student stu1
#if 0
voidfunc (Student s);voidfunc (Student s)
{
s.age= 18;//return 0;
}void func (Student*s);void func (Student*s)
{
s->age = 18;//return 0;
}#endif
#if 0Student func (Student s);
Student func (Student s)
{
s.age= 18;returns;
}#endifStudent*func (Student s);
Student*func (Student s)
{
s.age= 18;return &s;//不可以返回局部变量的地址
}intmain(){//Student stu2 ={0};
Student stu1 ={"李辉",30,30};//stu1 = func(stu1);
Student *ps =func(stu1);
printf("ps->name姓名=%s\n",ps->name);
printf("ps->score成绩=%d\n",ps->score);
printf("ps->age年龄=%d\n",ps->age);#if 0printf("姓名=%s\n",stu1.name);
printf("成绩=%d\n",stu1.score);
printf("年龄=%d\n",stu1.age);
printf("输入姓名:");//scanf("%s",stu1.name);
scanf("%s",ps->name);
printf("输入成绩:");//scanf("%d",&(stu1.score));
scanf("%d",&(ps->score));
printf("输入年龄:");
scanf("%d",&(ps->age));
printf("ps->name姓名=%s\n",ps->name);
printf("ps->score成绩=%d\n",ps->score);
printf("ps->age年龄=%d\n",ps->age);#endif
return 0;
}
结构体的数组
#include#includetypedefstruct student{ //student 可以省略
char name[20];intscore;intage;
}Student;//struct student stu1 ==>Student stu1//void func (Student s[],int len);
void input (Student *s,int len); //跟上面是一样的
void input (Student* s,intlen)
{for(int i = 0;i
{
printf("输入姓名:");
scanf("%s",s[i].name);
printf("输入成绩:");
scanf("%d",&(s[i].score));
printf("输入年龄:");
scanf("%d",&(s[i].age));
}//return 0;
}void output (Student *s,int len); //跟上面是一样的
void output (Student *s,intlen)
{for(int i = 0;i
{
printf("第%d个姓名:%s\n",i+1,s[i].name);
printf("第%d个成绩:%d\n",i+1,s[i].score);
printf("第%d个年龄:%d\n",i+1,s[i].age);
}//return 0;
}intmain(){
Student stu1={"李辉",30,30};
Student s[10]; //声明10个Student 结构体的数组
input(s,3);
output(s,3);
getchar();
getchar();return 0;
}