-
C语言操作底层或者是操作内存资源的优势是最合理的。
-
C语言重在学习思路,而不是语法。
-
gcc编译器:
gcc编译器根据文件后缀名寻找翻译官的,所以正常要带上 .c 或 .cpp (代表不同的翻译组织)
gcc -o 输出的文件名 输入的文件名
如:gcc -o build 001.c
./运行的程序
如:./build -
翻译组织:
gcc -v -S -c -o
gcc -E 预处理指令
预处理 --> 编译 --> 汇编 --> 链接
不是关键字 -
打印程序运行信息,函数调试时可以使用,用于程序错误时打印错误位置:
__FUNCTION__, 当前的函数名
__FILE__, 当前的文件名
__LINE__ 当前程序的行号,
printf(“the %s,%s,%d\n”,__FUNCTION__,__FILE__,__LINE__); -
调试时采用条件编译,如果定义了ABC,就执行某些语句,否则就不执行,在用gcc编译器时,可以直接在运行时执行该指令,而不需在程序内部添加条件编译语句。
如 : gcc -DABC -o build 001.c
-D表示调试,后面直接跟条件编译的判断变量。 -
硬件操作的最小单位:
bit 为1或0
软件操作的最小单位:
Byte 1Byte=8bit -
类型修饰符: auto register static const extern volatile
register ,限制变量定义在寄存器上的修饰符。定义一些快速访问的变量或者经常需要访问的变量,提高运行速度,如:register int a;但CPU内部的寄存器个数有限,当寄存器不足时,a 还是会放在存储器即内存中。取址运算符&对寄存器不起作用。
static 修饰3种数据:
(1) 修饰局部变量,函数内的变量:
默认的局部变量在栈空间存在,生存期较短;局部静态化之后,局部变量在静态数据段保存,生存期变长。
int fun()
{
int a;====>static int a;
}
(2) 修饰全局变量,函数外的变量:
防止重命名,限制变量名只在本文件内起作用。
int a;====>static int a;
int fun()
{
代码段
}
(3) 函数的修饰符,修饰全局函数,函数外的变量:
防止重命名,限制函数名只在本文件内起作用。
int fun()====>static int fun();
{
代码段
}
适用于多文件的工程项目中。
const 只读的变量,并不是严格的常量,可以使用指针改变const 修饰变量的值。
volatile 告知编译器编译方法的关键字,不优化编译,防止优化指向内存地址。修饰变量的值的修改,不仅仅可以通过软件,也可以通过其他方式(硬件)
-
CPU访问内部寄存器比访问内存要快很多,寄存器又称为CPU缓存器,寄存器越多,运行速度越快。
-
memcpy 和 strcpy的区别
-
结构体
最终结构体的大小一定是4的倍数,位域。结构体作为形参时,最好用指针的形式进行传递,节约内存空间。
结构体变量:
struct abc{int a; int b;int c;};
struct abd buf;
实参:
fun(buf); fun(&buf);
形参:
void fun(struct abc a1); void fun(struct abc *a2);
推荐使用右侧的用法。连续空间的传递最好使用指针。
基本数据类型 fun(void)
{
基本数据类型 ret;
********
ret =***;
return ret;
} -
const
const 全局变量放在常量区,一旦初始化,不能修改;
const 局部变量放在栈上,不能直接修改,但可以通过指针间接修改。