C语言学习
序
单纯为了防止自己忘记,记录一些较为重要的概念,可能对您没有任何作用,为了节约您的时间,可以不用往下看了。
指针
数据和变量在内存中都有一个地址,而指针作为一种特殊的变量,专门用于存放数据的指针(地址)。
- 定义指针变量的方法:
int *var
char *var2
如上所定义,var
和var2
分别定义了两个指向int, char
的指针变量,但是此时var
和var2
虽然类型确定了,但是具体指的是什么东西此时还未知,需要有下一步的赋值才有定义:
int a = 100;
var = &a;
&
的作用是取地址,于是a
的地址就被取出来赋给了var
指针。*
的作用是取值
注意,*
符号在定义一个新的指针变量的时候才写,对指针变量进行赋值时不能加*
。除此之外,在已经定义好的指针变量之前加*
,可以取出该地址指向的位置的数据。所以如果想修改指针,只能是p = &a
这种形式(下面代码第二行是初始化,等价于两行)
int a = 15;
int *p = &a;
printf("%d, %d\n", a, *p); //两种方式都可以输出a的值
输出:
15,15
函数
- 函数定义
dataType functionName(){
//body
}
– dataType
是返回值类型,它可以是C语言中的任意数据类型,例如 int、float、char 等。
– functionName
是函数名,它是标识符的一种,命名规则和标识符相同。函数名后面的括号()不能少。如果有参数输入,那么要在括号中加入参数声明。
– body
是函数体,它是函数需要执行的代码,是函数的主体部分。即使只有一个语句,函数体也要由{ }包围。
– 如果有返回值,在函数体中使用 return 语句返回。return 出来的数据的类型要和 dataType 一样。
结构体
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
};
以上代码则定义了一个结构体类型,其名为stu
,此时的stu
还和int
一样,只是一个类型,还需要具体定义一个变量才能使用:
struct stu a,b,c;
- 注意关键字
struct
不能少。
stu 就像一个“模板”,定义出来的变量都具有相同的性质。也可以将结构体比作“图纸”,将结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的。
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
- 在定义的结尾顺手声明了几个结构体变量。
- 需要注意的是,结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储。
- 使用
.
来获取成员数据
给结构体成员赋值
stu1.name = "Tom";
stu1.num = 12;
结构体指针
当一个指针变量指向结构体时,我们就称它为结构体指针。
//结构体
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1 = { "Tom", 12, 18, 'A', 136.5 };
//结构体指针
struct stu *pstu = &stu1;
注意,结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&
,所以给 pstu
赋值只能写作:
struct stu *pstu = &stu1;
而不能写作:
struct stu *pstu = stu1;
- 通过结构体指针获取成员的方法:
pointer->memberName
- 结构体指针作为函数参数
时结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速。
typedef
typedef
的主要作用是为一些数据结构起别名,达到少写代码,增强可读性的作用。
typedef oldName newName;
更多的,typedef
可以为结构体或者数组定义别名:
typedef struct stu{
char name[20];
int age;
char sex;
} STU;
如上所示,STU
是 struct stu
的别名,
STU body1,body2
等价于 struct stu body1, body2
;
文件引用
模块化编程中,.h
文件一般用于一些函数,变量,结构体的声明,而一般用另一个不包含main()
的.c
文件来具体描述函数的实现。
比如.h
文件是这样的:
而具体定义用的.c
文件长这样:
主函数则长这样: