C语言中的知识点

1.寄存器、内存和CPU的关系

数据从内存中取出来,然后放到寄存器中,CPU再从寄存器中取出数据进行处理,处理完成后再将数据放回到寄存器中,然后再从寄存器回到内存中。CPU从不跟内存直接打交道。因为寄存器的存取速度比内存要快得多,所以,先通过寄存器,然后再于内存进行数据交换;这样就意味着,register变量必须是一个单个的值,并且其长度应小于或等于整型的长度;而且,register变量可能不存放在内存中,所以不能用取址运算符"&"来获取register变量的地址

2.static 关键字的作用

2.1 修饰变量:无论是全局变量还是局部变量,被static修饰后,其都存储在内存的静态区

2.1.1:修饰全局变量

静态全局变量,作用域仅限于变量被定义的文件中,

2.1.2:修饰局部变量

在函数体内定义,只能在该函数体内使用。被static修饰的变量总是存在内存的静态区,所以即使当前函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时,仍然能用到这个值

2.2 修饰函数

该函数为静态函数,作用域局限于本文件,不能被该文件外的其他函数调用;

好处:不用担心自己定义的函数,是否与其他文件中的函数同名

3. 数据在内存中的存储

数据一律以补码的形式存储;主要是因为使用补码,可以将符号位和其他位统一处理;同时,减法也可按加法来处理。两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。正数的补码与其原码一致;负数的补码: 符号位不变,然后取其绝对值,再按位取反,最后加1,便得出其在内存中的存储数值。

4. union 大小端对它的影响

union 

{

int i; 

char  a[2];

}*p, u;

p = &u;

p->a[0] = 0x39;

p->a[1] = 0x38;


p.i 的值应该为多少呢?
这里需要考虑存储模式:大端模式和小端模式
大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。 p.i = 0x3938;
小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。 p.i = 0x3839;

union 型数据所占的空间等于其最大的成员所占的空间。对union 型的成员的存取都是相对于该联合体基地址的偏移量为0 处开始,也就是联合体的访问不论对哪个变量的存取都是从union 的首地址位置开始

使用这个方法,也可以用来检测,当前控制器的存储模式

下面这段程序输出什么

#include <stdio.h>
intmain()
{
int a[5]={1,2,3,4,5};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}

&a + 1:这里+1偏移的是一个sizeof(a)的大小,所以ptr1[-1] = 5;

(int)a + 1: 获得的是a[1]元素的数据,所以*ptr2 = 2;

5. enum枚举

枚举是一种数据类型,且是int型,所以使用sizeof求一个枚举变量所占的内存空间大小,其值为4

#define和enum

1)#define宏常量是在预编译阶段进行简单替换。枚举常量则是在编译的时候确定其值

2)枚举是一种数据类型,而#define不是


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值