c语言错误 向只读位,C语言常见陷阱错误及知识点

本文详细介绍了C/C++编程的基础知识,包括预处理机制、数据类型、指针、常量、内存管理以及数组和链表的区别。讲解了变量的生命周期、内存区域如堆栈的区别、const关键字的用法,以及指针常量和常量指针的概念。还提到了宏定义#define与const常量的不同之处,并探讨了数组的特性及其与链表的对比。
摘要由CSDN通过智能技术生成

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

主函数 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.插入 删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值