C99是啥
很多书籍开篇会突然提到C99标准,因此这里搜了一下。
C99是C语言的官方标准第二版。1999年12月1日,国际标准化组织和国际电工委员会旗下的C语言标准委员会正式发布了这个标准文件 ;
C99是在C89和C90的基础上发展起来的,增加了基本数据类型、关键字和一些系统函数等,C99有一部分是对于增加了宽字符集,还加入了一些库函数,是继C89标准之后的第二个C语言官方标准。
其中百度百科种讲的还是比较详细的,如C99的新特性,大家可以自己看看。
C语言数据类型
C语言数据类型如下:(图中有*的是C99标准所增加的)
C语言运算符
C语言提供以下运算符:
可以了解一下以下内容
C语言逻辑运算符
数据结构中常用的基础知识
以下是数据结构中常用的基础知识:
typedef
typedef 为C语言的关键字,作用是为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)
比如我们常用的
typedef int Status;
Status是函数的类型,其值是函数结果状态代码,如OK等
结构体
声明一个结构体
struct Student{
int num;
char name[20];
int age;
};
在声明类型的同时定义变量
struct Student{
int num;
char name[20];
int age;
}student1;
结构体指针
结构体指针就是指向结构体变量的指针。一个结构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的起始地址存放在一个指针变量中,那么这个指针变量的基类类型必须与结构体变量的类型相同。如:
struct Student * pt;
pt可以指向struct Student类型的变量或数组元素
例如
//声明结构体类型 struct Student
struct Student{
long num;
char name[20];
char sex;
float score;
};
struct Student stu_1; //定义struct Student类型的变量stu_1
struct Student *p; //定义指向 struct Student类型数据的指针变量p
p = &stu_1; //p指向 stu_1
接下来对结构体变量的成员进行赋值
赋值完成后进行打印输出,
printf("No.:%ld\n",stu_1.num);
printf("No.:%ld\n",(*p).num);
这两个printf函数输出结果一样
分析:
在主函数中声明了 struct Student类型,然后定义一个 struct Student类型的变量stu_1。又定义一个指针变量p,它指向一个 struct Student类型的对象。将结构体变量stu_1的起始地址赋给指针变量p,也就是使p指向stu_1,然后对stu_1的成员赋值。
第1个print f函数是通过结构体变量名stu_1访问它的成员,输出stu_1的各个成员的值。用 stu_1.num 表示stu_1中的成员num。第2个printf函数是通过指向结构体变量的指针变量访问它的成员,输出stu_1各成员的值,使用的是(*p).num这样的形式。(*p)表示p指向的结构体变量,(*p).num是p所指向的结构体变量中的成员num。
注意*p两侧的括号不可省,因为成员运算符“.”优先于“*”运算符,*p.num就等价于*(p.num)了。
说明:为了使用方便和直观,C语言允许把(*p).num 用p->num代替,“->”代表一个箭头,
p->num表示p所指向的结构体变量中的num成员。同样,(*p).name等价于p->name。
“->”称为指向运算符
如果p指向一个结构体变量stu,以下3种用法等价:
①stu.成员名(如 stu.num);
②(*p).成员名(如(*p).num);
③p->成员名(如 p->num)
上面内容在数据结构中会经常使用到。
(++p)->num与(p++)->num
(++p)->num
(p++)->num
(++p)->num是先使p自加1,然后得到p指向的元素中的num成员值
(p++)->num是先求得p->num的值,然后再使p自加1
以上两者是有区别的。
指针处理链表
struct Student{
int num;
float score;
struct Student * next;//next是指针变量,指向结构体变量
};
成员num和score用来存放结点中的有用数据(用户需要用到的数据),next是指针类型的成员,它指向 struct Student类型数据(就是 next所在的结构体类型)。
#include<stdio.h>
//声明结构体类型 struct Student
struct Student {
int num;
float score;
struct Student* next;
};
int main() {
struct Student a, b, c, * head, * p; //定义3个结构体变量 a.b.c 作为链表的结点
a.num = 10101; a.score = 89.5; //对结点 a 的 num 和 score 成员赋值
b.num = 10103; b.score = 90; //对结点 b 的 num 和 score 成员赋值
c.num = 10107; c.score = 85; //对结点 c 的 num 和 score 成员赋值
head = &a; //将结点 a 的起始地址赋给头指针 head
a.next = &b; //将结点 b 的起始地址赋给 a 结点的 next 成员
b.next = &c; //将结点 c 的起始地址赋给 a 结点的 next 成员
c.next = NULL; //c 结点的 next 成员不存放其他结点地址
p = head; //使 p 指向 a 结点
do {
printf("%ld %5.1f\n", p->num, p->score); //输出 p 指向的结点的数据
p = p->next; //使p指向下一结点
} while (p != NULL); //输出完 c 结点后 p 的值为 NULL ,循环终止
return 0;
}