Linux基本命令,vi编译器的使用,简单的编程步骤,程序语言,gcc编译器编译过程,进制转换相关知识可以查看文档http://t.csdnimg.cn/CmqhC
数值表示,词法符号,变量,常量相关知识可以查看文档http://t.csdnimg.cn/jJIe2
运算符和输表达式,输入输出相关知识可以查看文档http://t.csdnimg.cn/FJe89
控制语句,if-else,switch-case,for,while,do-while,循环控制语句相关知识可以产看文档http://t.csdnimg.cn/zskY3
一维数组,字符数组相关知识可以查看文档http://t.csdnimg.cn/1weqY
排序(冒泡排序和选择排序),二维数组相关知识可以查看文档http://t.csdnimg.cn/hvo5C
指针相关知识(概念,格式,初始化,指针运算)可以查看文档http://t.csdnimg.cn/8lop0
指针补充知识(指针修饰,二级指针,指针和数组,数组指针和指针数组)可以查看文档http://t.csdnimg.cn/m11Mj
函数基本用法(声明,调用,传参),开辟堆区空间,malloc函数,string函数族相关知识可以查看文档http://t.csdnimg.cn/cs4E3
目录
3.定义结构体变量时未初始化,需要单独给每个成员赋值。用成员访问符 ‘.’
(2)先定义结构体数组,再对数组的每一个元素中的每个结构体成员分别赋值。
函数补充一点知识:
递归函数
概念
递归函数是指一个函数的函数体中直接调用或者间接调用该函数本身的函数
执行的两个阶段
(1)递推阶段:从原问题出发,按递归公式递推从未知到已知,最终达到递归终止条件,
就是从最里层开始算,然后一层一层算,直到终止
(2)回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解
例题:求阶乘
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int fac(int n)
{
if (n <= 1)
return 1;
if (n > 1)
return n * fac(n - 1);
}
int main()
{
int n;
printf("请输入一个数:");
scanf("%d", &n);
int r = fac(n);
printf("%d的阶乘为%d\n", n, r);
return 0;
}
结构体
基本用法
1.概念
结构体是由一批数据组合而成的结构型数据。
使用结构体的好处:
(1)结构体的使用为处理复杂的数据结构(如链表等)提供了有效的手段。
(2)为函数间传递不同类型的数据提供了方便。
2.定义格式
struct 结构体名
{
数据类型 成员变量名1;
数据类型 成员变量名2;
数据类型 成员变量名3;
...
};
3. 结构体变量
(1)概念
通过结构体类型定义的变量
(2)定义格式
struct 结构体名 变量名;
(3) 定义结构体变量的方式
1.先定义结构体,再定义结构体变量
struct 结构体名
{
成员变量;
};
struct 结构体名 变量名;
2.定义结构体的同时定义结构体变量
struct 结构体名
{
成员变量;
}变量名1, 变量名2;
(4)结构体变量赋值
1.定义结构体变量时直接使用花括号赋值
2.定义结构体变量时用点等法赋值
例如struct student s2 =
{
.name ="xiaofang",
.age =18
};
3.定义结构体变量时未初始化,需要单独给每个成员赋值。用成员访问符 ‘.’
例如struct student s3;
s3.id=3;
s3.age=19;
(5)访问结构体成员变量
通过.访问: 结构体变量名.成员变量名
4.重定义 typedef
给数据类型另起名字
基本用法
1.给普通数据类型重命名
typedef int size4;
2. 给指针类重命名
typedef int *int_p;
3. 给数组类型重名
typedef int intA10[10];
总而言之,用数据类型定义变量时变量名写在哪,用typedef重命名时新名字就写在哪然后前面加个typedef就可以了。使用新名字定义变量时直接:新名字 变量名;
定义结构体的同时重定义
typedef struct flower
{
char name[32];
char color[32];
} FLOWER;FLOWER f1; //等同于 struct flower f1;
先定义结构体,然后重定义
struct flower
{
char name[32];
char color[32];
};typedef struct flower FLOWER;
FLOWER f1; //等同于 struct flower f1;
结构体数组
概念
结构体类型相同的变量组成的数组
定义格式
(1)定义结构体的同时定义结构体数组
struct student
{
int id;
int age;
} s[5];
(2)先定义结构体,然后定义结构体数组
struct student
{
int id;
int age;
};
struct student s[5];
初始化
(1)定义结构体数组同时赋值
(2)先定义结构体数组,再对数组的每一个元素中的每个结构体成员分别赋值。
结构体数组输入输出(for循环)
#include <stdio.h>
#include <string.h>
struct student
{
char name[32];
int id;
int age;
};
int main()
{
struct student s[3];
for (int i = 0; i < 3; i++)
scanf("%s %d %d", s[i].name, &s[i].id, &s[i].age);
for (int i = 0; i < 3; i++)
printf("%s %d %d\n", s[i].name, s[i].id, s[i].age);
}
结构体指针
概念
指向结构体变量的指针
定义格式
struct 结构体名 *结构体指针名;
struct student s;
struct student *p = &s;
结构体指针所指变量中的成员赋值
通过指向结构体变量的指针间接的去访问其中的成员:
格式: 指针变量名 -> 成员变量名
p->id =1;
p->age =19;
strcpy(p->name,"li");
或者:(*p).id=2; //不常用
大小
本质还是指针,8字节。(32位系统4字节)
结构体内结构体
如果成员变量本身属于另一种结构体类型,用若干个成员运算符一级级找到最低级的成员变量
关于结构体总结:
1. 不能把结构体类型变量作为整体引用,只能对结构体类型变量中的各个成员变量分别引用
2. 如果成员变量本身属于另一种结构体类型,用若干个成员运算符.一级级找到最低级的成员变量
3. 可以把成员变量当成普通变量运算
结构体大小以及对其原则
1 结构体大小可以用sizeof得出
sizeof(struct 结构体名);或者sizeof(结构体变量名);
结构体数组: 结构体类型大小*元素个数
sizoef(数组名);
2.字节对齐原则
(1)第一个成员在相对于结构体变量起始位置偏移量offset为0的地址处(通俗点来说,就是第一个成员变量的地址与结构体起始位置的地址是相同的),以后每个成员按定义顺序依次存放在offset为该数据成员大小的整数倍的地方,只有double类型存放在4的整数倍的地方(比如int在32位机器位4字节,要从4的整数倍开始存储)。
(2)用结构体里面最大的数据类型的大小和8(32位系统和4)进行比较,按照字节数小的为单位开辟空间。
3.节省空间原则
为了减少空间浪费,把占用空间小的成员集中到一起。总体上来说,结构体的内存对齐就是一种用空间换取时间的做法,浪费空间来换取性能上的提升。那在设计结构体的时候,我们既要满足对齐,又要节省空间。