0%

【C】C语言复习

C语言

菜鸟教程

数据类型

变量

常量

两种方式定义常量:

  • #define预处理器
  • const关键字

储存类

  • auto
  • register
  • static
  • extern

运算符

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 赋值运算符
  • 杂项运算符
运算符 描述 实例
sizeof() 返回变量的大小。 sizeof(a) 将返回 4,其中 a 是整数。
& 返回变量的地址。 &a; 将给出变量的实际地址。
* 指向一个变量。 *a; 将指向一个变量。
? : 条件表达式 如果条件为真 ? 则值为 X : 否则值为 Y

判断

  • if

    1
    2
    3
    4
    if(boolean_expression)
    {
    /* 如果布尔表达式为真将执行的语句 */
    }
  • if…else

    1
    2
    3
    4
    5
    6
    7
    8
    if(boolean_expression)
    {
    /* 如果布尔表达式为真将执行的语句 */
    }
    else
    {
    /* 如果布尔表达式为假将执行的语句 */
    }
  • 嵌套if

  • switch

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    switch(expression){
    case constant-expression :
    statement(s);
    break; /* 可选的 */
    case constant-expression :
    statement(s);
    break; /* 可选的 */

    /* 您可以有任意数量的 case 语句 */
    default : /* 可选的 */
    statement(s);
    }
  • 嵌套switch

循环

  • while

    1
    2
    3
    4
    while(condition)
    {
    statement(s);
    }
  • for

    1
    2
    3
    4
    for ( init; condition; increment )
    {
    statement(s);
    }

函数

  • 定义
1
2
3
4
return_type function_name( parameter list )
{
body of the function
}
  • 声明
  • 调用
  • 参数
    1. 传值调用
    2. 引用调用

作用域

  • 局部变量
  • 全局变量
  • 形式参数

数组

  • 声明一维数组:type arrayName [ arraySize ];

  • 声明多维数组:type name[size1][size2]...[sizeN];

enum(枚举)

定义枚举类型的同时定义枚举变量:

1
2
3
4
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

注意:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。在这个例子中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。

指针

1
type *var-name;
  • eg

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <stdio.h>

    int main ()
    {
    int var = 20; /* 实际变量的声明 */
    int *ip; /* 指针变量的声明 */

    ip = &var; /* 在指针变量中存储 var 的地址 */

    printf("var 变量的地址: %p\n", &var );

    /* 在指针变量中存储的地址 */
    printf("ip 变量存储的地址: %p\n", ip );

    /* 使用指针访问值 */
    printf("*ip 变量的值: %d\n", *ip );

    return 0;
    }

    结果:
    var 变量的地址: 0x7ffeeef168d8
    ip 变量存储的地址: 0x7ffeeef168d8
    *ip 变量的值: 20

    总结:

  • 指针就是内存地址,指针变量是用来存放内存地址的变量。

  • 使用“&”取地址,使用“*”访问地址。

字符串

字符串实际上是使用 null 字符 \0 终止的一维字符数组。

在定义时,计算数组长度要将结束符算进去。

定义方式:

  • char site[6] = {‘h’ , ‘e’ , ‘l’ , ‘l’ , ‘o’ , ‘\0’};
  • char site[] = “hello”;

结构体

  • 结构体
1
2
3
4
5
6
struct tag { 
member-list
member-list
member-list
...
} variable-list ;

tag 是结构体标签。

member-list 是标准的变量定义,比如 int i 或者 float f

variable-list 是结构变量。

定义时至少出现2个;

1
2
3
4
5
6
7
8
9
10
struct SIMPLE
{
int a;
int b;
int c;
};

struct SIMPLE example1;
struct SIMPLE example2;

访问结构体成员

1
2
3
example1.a=1;
example1.b=2;
example1.c=3;
  • 结构体指针
1
2
3
4
定义结构体指针:struct Books *struct_pointer;
结构体定义:struct Books Book1;
地址:struct_pointer = &Book1;
成员访问:struct_pointer->title;

eg:

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <string.h>

struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};

/* 函数声明 */
void printBook( struct Books *book );
int main( )
{
struct Books Book1; /* 声明 Book1,类型为 Books */
struct Books Book2; /* 声明 Book2,类型为 Books */

/* Book1 详述 */
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;

/* Book2 详述 */
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Zara Ali");
strcpy( Book2.subject, "Telecom Billing Tutorial");
Book2.book_id = 6495700;

/* 通过传 Book1 的地址来输出 Book1 信息 */
printBook( &Book1 );

/* 通过传 Book2 的地址来输出 Book2 信息 */
printBook( &Book2 );

return 0;
}
void printBook( struct Books *book )
{
printf( "Book title : %s\n", book->title);
printf( "Book author : %s\n", book->author);
printf( "Book subject : %s\n", book->subject);
printf( "Book book_id : %d\n", book->book_id);
}

结果:
Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700

共用体

共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。

1
2
3
4
5
6
7
union [union tag]
{
member definition;
member definition;
...
member definition;
} [one or more union variables];

typedef

#define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:

  • typedef 仅限于为类型定义符号名称,**#define** 不仅可以为类型定义别名,也能为数值定义别名,比如可以定义 1 为 ONE。
  • typedef 是由编译器执行解释的,**#define** 语句是由预编译器进行处理的。

输入&输出

  • getchar() & putchar()函数
  • scanf() &printf()函数

使用前需要 #include <stdio.h>

预处理器

C 预处理器本质是一个文本替换工具

#define 定义宏
#include 包含一个源代码文件
#undef 取消已定义的宏
#ifdef 如果宏已经定义,则返回真
#ifndef 如果宏没有定义,则返回真
#if 如果给定条件为真,则编译下面代码
#else #if 的替代方案
#elif 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
#endif 结束一个 #if……#else 条件编译块
  • 头文件防止重复编译:

    1
    2
    3
    4
    5
    6
    #ifndef _HEAD_H
    #define _HEAD_H
    ...
    // ... some declaration codes
    ...
    #endif
  • 条件编译,避免使用大段注释//

    1
    2
    3
    4
    5
    6
    7
    8
    #if 常量表达式1
    // ... some codes
    #elif 常量表达式2
    // ... other codes
    #elif 常量表达式3
    // ...
    ...
    #endif

头文件

建议把所有的常量、宏、系统全局变量和函数原型写在头文件中,在需要的时候随时引用这些头文件。

引用头文件的语法

  • 引用系统头文件,在系统目录的标准列表中:#include <file>

  • 引用用户头文件,在包含当前文件目录下:#include "file",如果在程序目录没找到就去编译器的类库路径目录下寻找该文件。

强制类型转换

强制类型转换是把变量从一种类型转换为另一种数据类型。

递归

递归指的是在函数的定义中使用函数自身的方法。

语法格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
void recursion()
{
statements;
... ... ...
recursion(); /* 函数调用自身 */
... ... ...
}

int main()
{
recursion();
}

可变参数

内存管理

命令行参数

执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是想从外部控制程序,而不是在代码内对这些值进行硬编码时。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main( int argc, char *argv[] )
{
if( argc == 2 )
{
printf("The argument supplied is %s\n", argv[1]);
}
else if( argc > 2 )
{
printf("Too many arguments supplied.\n");
}
else
{
printf("One argument expected.\n");
}
}

argv[0] 存储程序的名称,argv[1] 是一个指向第一个命令行参数的指针,如果没有提供任何参数,argc 将为 1,否则,如果传递了一个参数,argc 将被设置为 2。

排序算法

  1. 冒泡排序
  2. 选择排序
  3. 插入排序
  4. 希尔排序
  5. 归并排序
  6. 快速排序