C 摘要
时间:2021-09-01 15:40:40
参考:
这是自己工作中用到的第三种编程语言,JAVA、Go和C语言。其它的还接触过 Perl、C++、C#、Lua和Python,Python算是写过一些代码,其它语言的了解成都比知道多一点点。
多年之后拿起C语言,之前的指针、文件操作都清晰了。
第一次接触C语言应该是大一时(2011年),课堂上学的C语言,那时候刚接触电脑,对编程语言、操作系统是一头雾水,很难学会也很难应用,毕业之后一直用JAVA做Web项目开发。今年三月底开始用Go语言和最近一周开始用C语言。
C 摘要#
关于指针#
指针指向一块内存地址。指针在内存中也有自己的内存地址。
int类型的指针指向内存中存储int数据的位置。int值在内存中占用四个字节,因此int类型指针的加一操作会把指针的地址移动四个字节,即地址加四。其它类型加一操作,如 short 移动两个字节,double移动8个字节。
字符串在C中用 char * name
表示,即字符指针,或者数组 char name[100]
表示。当用字符指针表示的时候需要手动申请空间,在C中使用 \0
做数组结束的标志,因此申请的长度需要比实际长度加一,多出一个字节存储 \0
表示字符串结束。用数组表示字符串会存在空间浪费的问题,但是使用起来方便。
数组在C语言中等价于一个指针。如 int 类型的数组等价于一个int类型的指针,指针指向数组第一个元素的位置。数组指针加一就是第二个元素的位置,加二就是第三个元素的位置,依次类推。
关于作用域#
块做作用域: 在代码块 {}
中声明的变量在代码块内有效。
文件作用域(单个文件有效): 在函数外面定义的变量在文件内有效,从定义位置开始到文件结尾。
全局作用域: 在其它文件中也可使用。
#include <stdio.h>
void function_scope_function(int function_scope) {
//方法内部有效
printf("function_1:%d\n", function_scope);
}
//全局变量 可以被引用的文件使用
int file_scope = 1;
//单个文件内有效
static int file_static_scope = 1;
void file_scope_function() {
printf("function_2:%d\n", file_scope);
}
int main() {
//代码块内有效
int code_block_scope = 2;
printf("function scope:%d\n", code_block_scope);
function_scope_function(3);
file_scope_function();
}
关于变量修饰符#
volatile:表示变量地址可以被其它程序访问。用于在线程或者进程之间共享数据。
关于变量生存周期#
用 static
修饰的变量在程序运行期间一直存在,并且变量只会在代码编译期间初始化依次,因此变量的地址不变。
关于宏定义#
可以定义字面量,在程序编译的时候会替换对应的字面量。
#include "stdio.h"
/**
* define 定义字面量,就是一个文本
* 程序会把对应的地方替换成字面量的值。
* 比如: int x = TWO; 等价于 int x = 2;
*/
#define TWO 2
#define FOUR TWO*TWO
#define PX printf("X is %d\n", x)
#define FMT "X is %d\n"
int main(void) {
int x = TWO; // int x = 2;
PX; // printf("X is %d\n", x);
x = FOUR; // x = TWO * TWo = 2 * 2;
printf(FMT, x); // printf("X is %d\n", x);
return 0;
}
关于导入文件#
<stdio.h>
会从系统库查找对应的文件。
"test.h"
会从当前项目目录查找对应的文件。
为了避免重复导入文件,需要在要导入的文件中使用宏定义定义字面量,在导入的文件中通过判断字面量是否定义决定是否导入。
test.h
内容如下:
main.c
引入 test.h