1. 变量作用域C 语言中,作用域(Scope)是指程序中变量、函数的可见性和生命周期的范围。作用域规定了在程序中的哪些地方可以访问变量、函数。
C 语言中主要有以下几种作用域:
文件作用域(File Scope):函数之外定义的变量具有文件作用域,也称为全局作用域。在文件的任何地方都可以访问这些变量,直到文件结束。
块作用域(Block Scope):在函数中、循环或复合语句块内部定义的变量具有块作用域,也称为局部作用域。只能在定义它们的块({}之间的一段代码)内部访问。
函数原型作用域(Function Prototype Scope):函数原型中声明的形式参数具有函数原型作用域。它们只在函数原型内部可见,用于声明函数的参数类型。
函数作用域(Function Scope):在早期版本的 C 语言中(如 C89),函数内部定义的变量具有函数作用域。它们只能在定义它们的函数内部访问。但是在较新的 C 语言标准中,函数内部定义的变量具有块作用域。
变量的作用域可以通过声明位置和跨越的区域来确定。一般来说,变量的作用域从声明点开始,直到其所在的块(或函数) ...
1. 字符指针1.1 处理字符串字符指针是指向字符(char)数据类型的指针变量。它们可以用于处理字符串(以 NULL结尾的字符数组)和字符数组,并对其中的字符进行读取、修改和操作。以下是一个示例,展示了字符指针的使用:
123456789101112131415161718192021#include <stdio.h>int main() { char str[] = "Hello, World!"; // 字符数组 char* p = str; // 字符指针指向字符数组的首地址 *p = 'h'; p++; *p = 'a'; // 通过字符指针访问字符数组中的字符 char* ptr = str; while (*ptr != '\0') { printf("%c", *ptr); ptr++; // 指针后移一个位置 } printf ...
函数和指针在 C/C++ 中常常一起使用,指针可以用于传递函数参数、返回函数结果或者作为函数的返回值。这样做可以实现更灵活和高效的程序设计。
下面是一些常见的函数和指针的使用方式:
1. 指针做函数参数1.1 参数为变量可以将指针作为函数的参数,从而在函数内部直接访问并修改指针所指向的变量。这样可以避免在函数调用时进行变量的拷贝,提高程序的运行效率。
需求:编写一个函数实现两个变量之间的值的交换
123456789101112131415161718192021222324252627282930313233#include <stdio.h>void swap1(int x, int y){ int tmp; tmp = x; x = y; y = tmp; printf("x = %d, y = %d\n", x, y);}void swap2(int* x, int* y){ int tmp; tmp = *x; *x = *y; *y = tmp;& ...
1. 操作数组元素在C语言中,数组名实际上就是一个指向数组首元素的指针。换句话说,可以把数组名视为指向了数组的第一个元素的内存地址。
例如,对于一个整型数组 int arry[5] = {1, 2, 3, 4, 5},我们可以通过数组名 arry 或者通过取指针操作符 &arry[0] 来获取指向数组第一个元素的指针。数组名字是数组的首元素地址,但它是一个常量:
12345678910#include <stdio.h>int main(){ int arry[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; printf("arry = %p\n", arry); printf("&arry[0] = %p\n", &arry[0]); arry = 10; //error, 数组名只是常量,不能修改 return 0;}
使用指针操作数组可以通过以下几种方式进行:
指针访问数组元素:可以使用指针 ...
1. 内存关于内存我们都耳熟能详,对于程序员而言,可以从两个维度去理解这个概念 — 物理存储器和存储地址空间:
内存是计算机系统中用于存储数据和指令的地方。它是计算机的关键组件之一,用于临时存储和处理正在运行的程序所需的数据。
主板上装插的内存条
显示卡上的显示RAM芯片
各种适配卡上的RAM芯片和ROM芯片
计算机的内存通常被划分为不同的存储单元,每个存储单元都有一个唯一的地址,用于标识其在内存中的位置。每个存储单元都可以存储一定数量的数据。
编码:对每个物理存储单元(一个字节)分配一个号码
寻址:可以根据分配的号码找到相应的存储单元,完成数据的读写
我们可以将内存抽象成一个很大的一维字符数组,编码就是对内存的每一个字节分配一个唯一的32位或64位的编号(与32位或者64位处理器相关),这个内存编号我们称之为内存地址,例如:一个内存地址可能是0x00007FF6D9A5C000。
内存中的每一个数据根据类型的不同,分配的内存大小也不尽相同:
char:占1个字节分配1个地址
int、float:占4个字节分配4个地址
double、long long:占8个字节 ...
CLion是JetBrains开发的一个强大的集成开发环境(IDE),专门用于C和C++的开发,并且适用于各种规模和类型的项目。它提供了许多有用的功能和工具,以提高开发者的效率和开发质量。
下面为大家详细介绍如何基于Clion进行基于远程服务器的项目开发。
1. 配置工具链打开Clion并创建一个新的项目,然后打开项目的属性对话框窗口:
在右侧的列表框中找到构建、执行、部署 -> 工具链选项,如下图:
点击右侧窗口左上角的+按钮,弹出下拉菜单,选则要添加哪种类型的工具链,通过不同的选项就可以配置不同的工具链,以供编译程序的时候使用。
如果是新安装的Clion IDE是不能够直接使用,也需要按照上述方式先进行工具链的配置。
如果使用MinGW编译添加需要自己先去下载,部署到Windows之后才能进行选择
如果使用Visual Studio的编译套件,需要先安装VS
如果使用远程主机的编译套件,需要进行下面的配置。
1.1 添加远程主机如果要连接的是远程云服务器或者虚拟机需要选择远程主机选项,可以看到如下窗口并填写相应是信息。
在默认情况下肯定是没有配置过任何ss ...
1. 程序编译的四个阶段C程序的编译过程包含了四个主要阶段,它们是:
预处理(Preprocessing):在这个阶段,预处理器会处理源代码中的预处理指令,包括宏展开、文件包含、条件编译等。
编译(Compilation):在编译阶段,编译器将预处理后的代码转换为汇编语言或机器语言。
汇编(Assembly):在汇编阶段,汇编器将目标代码转换为可重定位目标文件(Object File)。
链接(Linking):在链接阶段,链接器将可重定位目标文件和库文件进行链接,生成最终的可执行文件。
这四个阶段通常顺序进行,每个阶段都有各自的工具和处理过程。整个编译过程将源代码转换为可以在特定平台上运行的可执行文件。
在C程序的预处理阶段,主要有以下几个任务:
宏替换:预处理器会根据#define指令定义的宏,将源代码中的宏标识符替换为相应的宏定义文本。这个过程称为宏替换或宏展开。宏替换可以用来简化代码、增加可读性,以及定义常量或函数宏等。
头文件展开:预处理器会根据#include指令将指定的头文件内容插入到源代码中。头文件中通常包含了函数原型、宏定义、结构体声明等,这样可以 ...
1. 函数概述1.1 函数的分类C语言是一种通用的高级编程语言,拥有丰富的函数库和强大的系统编程能力。在C语言中,函数是模块化和可重用的代码段,用于实现特定的功能。函数将一系列的语句组织在一起,可以接受输入参数并返回值。
函数的定义包括函数名、参数列表、返回类型和函数体:
函数名是唯一的标识符,用于调用函数。
参数列表指定了函数接受的参数,可以是任意数量和类型的参数。
返回类型指定了函数返回值的类型,可以是基本数据类型、指针类型或结构体类型。
函数体是实现具体功能的语句块。
C语言中的函数可以分为以下几类:
标准库函数(Standard Library Functions):C语言提供了很多常用的函数,如输入输出函数(如scanf和printf)、字符串处理函数(如strcpy和strlen)、数学库函数(如sqrt和sin)等。这些函数被包含在标准库中,可以直接调用。
用户自定义函数(User-defined Functions):在程序中,我们可以自定义函数,通过函数名调用并执行特定的功能。用户自定义函数可以接受参数并返回值,可以将程序分解成多个函数,提高代码的模块化和可读 ...
1. 数组概述在C语言中,数组是一种存储多个相同类型元素的数据结构。数组在内存中是连续存储数据的,通过索引访问和操作数组中的元素。
在C语言中,数组使用一个中括号来描述其固定的容量,格式如下:
1数据类型 变量名[数组大小];
按数组元素类型的不同,可分为:数值数组、字符数组、指针数组、结构数组等类别。
123int a[10]; // 数值数组, 可以存储 10 个整形数值char s[24]; // 字符数组, 可以存储 24 个字符char *p[5]; // 指针数组, 可以存储 10 个 char* 类型的指针(地址)
通常情况下,数组元素下标的个数也称为维数,根据维数的不同,可将数组分为一维数组、二维数组、三维数组、四维数组等。通常情况下,我们将二维及以上的数组称为多维数组。
2. 一维数组2.1 定义和使用想要定义一个一维数组,有以下几个知识点需要我们注意:
数组名字符合标识符的书写规定(数字、英文字母、下划线)
数组名不能与其它变量名相同,同一作用域内是唯一的
方括号[]中常量表达式表示数组元素的个数
int a[3] 表示数组 ...
1. 流程结构概述程序流程结构是指编程中用于组织和控制代码执行顺序的结构。通过流程结构,可以按照特定的逻辑和条件来控制代码的执行路径,从而实现不同的功能和逻辑控制。以下是常见的程序流程结构:
顺序结构(Sequence Structure):按照代码编写顺序从上到下一行接一行地依次执行。
1234567891011#include <stdio.h>#include <stdbool.h>int main(){ bool flag = true; flag = !flag; printf("flag = %d\n", flag); flag = !flag; printf("flag = %d\n", flag); return 0;}
通过上面的示例代码可以看到,顺序结构的逻辑非常简单,下文就不再进行赘述。
选择结构(Selection/Decision Structure):根据给定的条件选择性地执行不同的代码块。
循环结构(Iteration/Loop Structure):循环执行一段代 ...