C语言知识复习

C 语言教程 | 菜鸟教程

1 Vscode 编译调试 C 代码

由于 vscode 只是一个文本编辑器,因此需要配置 task.jsonlaunch.json 来完成编译和调试的工作。(笔者的 C 环境基于 WSL 2(Ubuntu-20.04)搭建)
task.json 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build C Program",
            "type": "shell",
            "command": "gcc",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": [
                "$gcc"
            ]
        }
    ]
}
  • version:指定配置格式版本,当前仅支持 "2.0.0"

  • tasks:任务数组,每个元素对应一个可执行任务。

  • label:任务名称,用于引用(如 preLaunchTask)和在 UI 列表中显示。

  • type:任务类型,常见值 "shell"(在 shell 中运行)或 "process"(直接启动可执行文件)。

  • command:要执行的命令或程序名称。

  • args:传递给命令的参数列表,可使用内置变量插值。

    • "-g":生成调试符号,便于 GDB 等调试器进行源码级调试。
    • "${file}":当前活动编辑器中打开的文件的完整路径(如 /home/user/main.c)。
    • "-o":GCC 的输出重定向选项,指定后续输出文件路径。
    • "${fileDirname}/${fileBasenameNoExtension}":将可执行文件输出到源文件同目录,文件名与源文件同名但无扩展名(如输出 /home/user/main)。
  • group:将任务归类(如 buildtest),并可标记为默认组内任务。

  • problemMatcher:指定如何解析命令输出,将编译器错误/警告映射到“问题”面板。

launch.json 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "WSL Debug C",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb",
            "miDebuggerArgs": "--nx",
            "preLaunchTask": "Build C Program"
        }
    ]
}

2 C 语言作用域

作用域是程序中定义的变量所存在的区域,超出该区域后变量就不能被访问。C 语言的变量有三种:

  1. 在函数内部的局部变量
  2. 在所有函数外部的全局变量
  3. 形式参数的函数参数定义

2.1 局部变量

在某个函数或者块内部声明的变量称为局部变量。他们只能被该函数或代码块内部的语句访问,在函数或块外部是不可知的。

2.2 全局变量

全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。

如果局部变量和全局变量的名字相同的话,在函数内优先使用局部变量。

2.3 形式参数

函数的参数,形式参数,被当作该函数内的局部变量,如果与全局变量同名它们会优先使用。

3 指针

指针即为内存地址,指针变量是用来存放内存地址的变量,使用前必须声明。

1
type *var_name;

type 为指针的基类型,var_name 为指针变量的名称,以下是有效的指针声明:

1
2
3
4
int    *ip;    /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */

不同类型的指针对应的指针的值的类型是一样的,都为代表内存地址的十六进制数。不同类型的指针的区别为指针指向的变量或常数的数据类型不同。

3.1 指针使用方法

定义一个指针变量,把变量的地址赋给指针,访问指针变量中的地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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;
}
//参考菜鸟教程

3.2 NULL 指针

指针变量声明的时候,如果没有确切的地址幅值,则可为指针变量赋一个 NULL,此时该指针被称为空指针。


C语言知识复习
https://www.moerjielovecookie.icu/2025/04/19/C语言知识复习/
作者
Sawen Moerjie
发布于
2025年4月19日
许可协议