C语言学习笔记
枚举(enum)
一、枚举变量的定义
可以通过以下三种方式来定义枚举变量
1、先定义枚举类型,再定义枚举变量
1 | enum DAY |
2、定义枚举类型的同时定义枚举变量
1 | enum DAY |
3、省略枚举名称,直接定义枚举变量
1 | enum |
元素之间直接逗号连接,最后一个后面直接跟花括号了,不需要再加逗号或者分号,但是花括号后面要加分号(;)
注意:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。
实际中发现无法通过定义其他成员来实现所有的定义。比如无法通过定义第三个成员来使得第一为-1,第二成员为0·······
结构体
指向结构的指针
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
struct names
{
char first[LEN];
char last[LEN];
};
struct guy
{
struct names handle;
char favfood[LEN];
char job[LEN];
float income;
}
int main(void)
{
struct fellow[2]=
{
{
{"sdsa","asdasd"},
"sadas",
"asdads",
165651
},
{
{"sdsa","asdasd"},
"sadas",
"asdads",
165651
}
};
}
struct guy *him;struct guy *him;
结构体指针的声明。该声明并未对him进行定义,him此时并没有指向任何变量,例如在上述代码中,可以这样写him=&fellow[0]
,这样him就指向了这个结构体。而him+1
就指向的是fello[1]了。访问结构体成员的方法是
->
用这个符号,比如him->job
而不能写成him.job
因为him并不是结构体的名称;第二种方法,我们知道,him=&fellow[0]
也可以写成*him=fellow[0]
也可以发现&和*是一对互逆的运算符,所以可以这样写( *him).job
链表
内存有4个区:
代码区:函数代码 存放在代码区,函数名就是这个函数的地址。
全局区:全局变量、字符串常量,会有初始化。(举个例子:如果定义一个全局变量没有赋值,直接打印结果会是0)
栈区:定义的局部变量都储存在这,所以写程序一味地float、int什么的可能会导致栈区爆炸。由C系统开辟、释放
堆区:自己决定开辟和释放。堆区头文件
#include "stdlib.h"
malloc()
:开辟内存,要开辟几个字节就写几;返回值是一个地址
1
2
3
int *p;
p=(int *)malloc(size);- 用 malloc开辟的内存不会主动释放,需要用
free(p)
来释放
链表:一种数据结构。节点:每一块开辟出来的内存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17struct Data{
int x;
int y;
}
/*节点的结构体*/
struct Node{
Data data;//数据
struct Node *pnext;//指向下一个的指针
}
/*链表*/
struct List{
Node *pfront;//首指针
Node *pfinal;//尾指针
int count;//链表中有多少节点
}
1 | /*节点的结构体*/ |
1 |
|
容易被忽略的点
- char实际上并不是有符号的字符类型,在实际中,是由编译器决定的。在keil中默认的是无符号
- 0U、1U这些结尾是U的表示的是无符号整型,如果不写默认会是有符号的整型。0.1f是float类型
—————————————— 持续更新······ ——————————————