C语言常见陷阱错误及知识点

“#”预处理机制(独立于编译期)遇到<>查找系统 遇到“”先查找自己的没有查找库的

主函数 int main(int argc, char*argv[])  第二个参数代表要传的字符串 例如 ./app aa bb 就可以将aa bb传进去 现在的第一个参数是 3 (这个参数会将操作命令也算入)

基本的数据类型

I.整数   char   一个字节   -128~127   short 两个字节 -32768~32767   int   四个字节 -2147483648~2147483647   long 四字节(32x) 八个字节(64x)

II.小数(实型)float 四个字节 精确到小数点后六位  double 八个字节 精确到小数点后八位

例题

char a,b,c,d;

a=30;

b=a++;

c=++a;

d=(a++)*10;

答案:a=33;  b=30; c=32; d=64;

解析:1)b=a++; 先赋值再++ 所以b=30 执行完这条语句后a变为31;

           2)c=++a;先++再赋值 c=32,此时的a变为 32;

           3)d=(a++)*10; 先赋值再++ 所以 d=32*10;但是 a,b,c,d 都为char所以会发生截断 为64

例:

  int i=4; int j=5;  int k; k=i+++j; 执行完后 i? j? k?

答案为 i=5,j=5,k=9;

解析:+++有三个+号时 ++跟前面的结合 即  k=(i++)+j;

逻辑运算符 && || 短路原则 (非零真 零假)

对内存的操作:读,写,取地址   内存基本操作单元是字节

内存分为 堆区 栈区 字符常量 代码 全局(静态)

堆区:程序员放的 由链表管理堆区空间

栈:除了全局静态变量以外的变量

字符常量:存字符常量

全局(静态):存全局和静态变量

堆区和栈区的区别:

1.申请方式(栈:系统 堆:程序员)

2.栈区效率高,堆区有内存碎片

3.生命周期(栈区:系统回收 堆区:遇到delet free)

4.生长方向(空间分配)(栈区:从大地址到小地址 堆区:从小地址到到大地址)

5.访问

6.存储内容

全局和静态区别:作用范围  全局更大 全局是整个项目 静态是定义的那个文件 静态是定义一次丙炔保存其值

const在c语言和c++中的区别

区别1:
 C语言的const是定义了一个const变量,该变量只具备读的功能,而不具备写的功能。
 C++的const是定义了一个常量。

const int a = 5;
int array[a];//在C语言中是错误的,因为在C语言中是定义了一个只读变量
int array[a];//在c++中是正确的,因为在C++中定义了一个常量

区别二:
C语言中不能定义const函数,而C++中可以定义const函数。
C++的const成员函数:不能修改类的成员变量的值。(此处就不列举例子了)

指针常量和常量指针:

1、指向指针的常量:当const在*号前面就是指向常量的指针。

2、常量指针当const在*号之后

   char *const p1 = "12445";
   p1[0] = 'w';  //正确,可以修改指向内存的值
   p1 = "ddddd"; //错误,不能修改p1指向的内存

define const 区别:

1.编译器处理方式不同
define宏是预处理阶段展开
const常量是编译运行阶段使用

define是宏定义,程序在预处理阶段将用define定义的内容进行替换,因此程序运行时常量表中并没有用define定义的常量,系统不为其分配内存。
const常量是编译运行时的常量,系统为其分配内存。

2.类型跟安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开
const常量有具体的类型,编译运行时会执行类型检查

3.存储方式不同
define仅仅是展开,有多少地方使用就展开多少次,不分配内存
const常量会在内存中分配(可以在堆中也可以在栈中)

4.const可以节省空间,避免不必要的的内存分配。

define注意“边缘效应”,
例:#define N 2+3 //N的值是5
int a = N/2,//在编译时我们预想a=2.5,实际打印结果是3.5
原因是在预处理阶段,编译器将a=N/2处理成a=2+3/2,这就是define宏的边缘效应;
所以我们应该写成#define N (2+3)

数组:连续类型相同的

int a[5]={1,2,3,4,5};

a==&a[0];

数组名代表首元素的首地址    &+数组名:整个数组的首地址  sizeof(数组名)整个数组

sizeof()不是函数是一个含参数的宏

数组偏移 

a+1向后偏移4个字节

&a+1向后偏移a[5]

求*((int*)((int)&a+1))

   

(int)&a=0x10   0x10+1=0x11

*int(0x11) 连续四个字节再取* 02000000

数组与链表的区别

1.空间的连续性与否

2.支持不支持随机访问

3.空间的固定

4.插入 删除

 

 

你可能感兴趣的:(C语言常见陷阱错误及知识点)