C--复习笔记

<span style="font-size:14px;">

int (*a)[10];	a是指向具有10个整型数数组的指针
int (*a)(int);	a是一个函数指针,通过用于回调函数
int (*a[10]) (int);a是一个有十个函数指针的数组,每个指针指向一个返回值是int,参数是int的函数

只有全局变量和static变量能存储在静态存储区(固定内存中),静态存储区的变量只初始化一次(下次再对该变量初始化会跳过)且直到程序结束才释放该变量
静态存储区的变量会初始化为0,所以全局变量和静态变量初始化为0
自动变量(局部变量):局部没有经过任何修饰的局部变量叫自动变量 (它存在于动态数据区——栈),这个区域内的数据随着程序的运行动态的生成和释放,函数返回就释放,函数要调用就生成。关键字:默认是atuo(一般不写)
static变量的三个作用:隐藏,持久性和初始化为0

/t是垂直制表符,会上下垂直对齐,一般是8个空格

关键字const是"只读"的意思,不能写。作用是保护数据,防止被随便修改
const int a;==int const a;
const int *a;		a指针指向一个int型的常整数
int * const a;		a指针是一个常指针,不能被改变
int const *a const;	a指针是一个常指针且指向一个常整数
如果你在函数外这样声明一个变量,const int a ; 变量a的连接性为内部链接,只能在定义他的文件内使用

关键字volatile 修饰易失性变量,使用的场合:
(1)并行设备的寄存器(如:状态寄存器,控制寄存器等)
(2)被中断访问的非局部变量(全局变量或静态变量)
(3)多线程中的共享变量
可以用const修饰volatile,同时一个指针也可以是volatile类型的
关于volatile的一段经典代码:
int square(volatile int *ptr)
{
	return *ptr * *ptr;
}
相当于:
int squere(volatile int *ptr)
{
	int a=*ptr;
	int b=*ptr;
	return a*b;
}
上面这段代码是想求*ptr的平方,但是当第二次读取*ptr时,如果有其他线程修改了*ptr的值,那么得出来的结果就不是你想要的了
所以应该这么该:
int square(volatile int *ptr)
{
	int a=*ptr;
	return a*a;
}

用__interrupt修饰的中断服务子程序(ISR):
(1)不能有返回值
(2)不能有参数
(3)double型和printf是不可重入,因此它们是不明智的

unsigned int a=3;
int b=-18;
a+b时,b会自动转换成unsigned int类型,a+b会是一个很大的整数

typedef和#define定义一个结构体的区别:
#define dps struct s *
typedef struct s * tps;
当定义一个变量时两个一样,当定义多个变量时,如:dps p1,p2;展开为struct s *p1,p2;此时p2是一个结构体变量而不是指针

sprintf函数,形式:sprintf(char * buf,const char * format,[argument]...);  将字符串abc放到ptr所指的区域
printf函数可以这样用:printf(prompt);其中prompt是一个char型指针,指向一个字符串。

自动化变量(局部变量)位于栈区(stack),使用malloc申请的内存位于堆区(heap),malloc申请的内存程序结束后也会自动释放。栈的空间相对较小,所以需要大的内存时用malloc申请堆的空间
非自动变量(全局变量和静态变量)的内存是固定内存

库函数(API)实际是对系统调用的封装



</span>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值