您现在的位置是:首页 >技术杂谈 >关于C语言网站首页技术杂谈

关于C语言

knighthood2001 2024-06-14 17:17:16
简介关于C语言

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
",stu_1.num);
printf("No.:%ld
",(*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
", p->num, p->score); //输出 p 指向的结点的数据
        p = p->next; //使p指向下一结点
    } while (p != NULL); //输出完 c 结点后 p 的值为 NULL ,循环终止
    return 0;
}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。