C相关知识

1.函数指针与指针函数

1.1 指针函数

指针函数,简单理解就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。声明格式如下:
*类型标识符 函数名(参数表)
例如:

int *myfun(int x,int y);

注意:在函数名前面多了一个*号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针。
指针函数的写法可以有以下几种:

int *fun(int x,int y);
int * fun(int x,int y);
int* fun(int x,int y);

*靠近返回值类型的写法更容易理解。

1.2 函数指针

函数指针,其本质是一个指针变量,该指针指向这个函数。函数指针就是指向函数的指针。声明格式如下:

类型说明符 (*函数名) (参数)
例如:

int (*myfun)(int x,int y);

把一个函数的地址赋值给函数指针变量有两种写法:

myfun = &Function;
myfun = Function;

注意:&不是必需的,因为一个函数标识符就表示了它的地址。
调用函数指针的方式也有两种:

x = (*myfun)();
x = myfun();

2. 常量指针与指针常量

常量指针:指针指向的地址可变,指针指向的值不可改变(指向的是一常量)
指针常量:指针的内容,即地址不可变,但指向空间的值可变(地址是一个常量)。

1)const 在*前:表示const修饰的为所申明的类型。常量指针
2)const 在*后:表示const修饰的为指针。指针常量
3)前*后均有:表示const同时修改类型和指针。指向常量的指针常量

3. inline函数

3.1 GCC编译原则

编译器工作时,以 .c 文件为单位逐个编译 .o 文件,每个 .c 文件的编译是独立的,如果 当前 .c 文件中要用到外部函数,那么就在编译时预留一个符号。等到所有 .o 文件生成后,链接时才给这些符号指定地址(链接脚本决定地址),所以这个 . c 文件编译时只会看到外部函数的声明而无法知道它的函数体。而内联函数声明时,加关键字 inline 修饰。调用到它的地方直接将汇编代码展开,而不需要通过符号(函数名)地址跳转。

3.2 为什么要使用inline函数

在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。
在这里插入图片描述
上面的例子就是标准的内联函数的用法,使用inline修饰带来的好处我们表面看不出来,其实,在内部的工作就是在每个for循环的内部任何调用dbtest(i)的地方都换成了(i%2>0)?”奇”:”偶”,这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。

3.3 使用限制

只适合函数体内部代码简单的函数使用
不能包含复杂的结构控制语句例如while、switch
不能内联函数本身不能是直接递归函数

3.4 使用方式

gcc 的 inline、static inline 都很好理解:就是对普通函数添加了可内联的属性,每个函数还是有自己的汇编代码段,只是其他函数调用内联函数时,不是通过符号地址跳转,而是直接展开内联函数代码段。

4. const用法

在这里插入图片描述

5. 全局变量

在这里插入图片描述
PS:针对嵌入式软件

6. 字节序和比特序

在这里插入图片描述

6.1 字节序

在这里插入图片描述

6.2 比特序

对于0xB4数据的不同比特序存储
在这里插入图片描述

7. 大小端

32位int型数0x12345678大小端存储位置
在这里插入图片描述
数组存储方式:数组随着下标的增长,地址是由低到高变化的
在这里插入图片描述

8. 字节对齐

需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个short然后组合得到所要的数据,如果变量在0x00000003地址上的话则要访问三次内存,第一次为char,第二次为short,第三次为char,然后组合得到整型数据。而如果变量在自然对齐位置上,则只要一次就可以取出数据。
基于Eclipse测试结果如下:
在这里插入图片描述
语法:attribute((aligned(x))) :按照x字节对齐
参考资料:https://www.cnblogs.com/ransn/p/5081198.html

9.其他

9.1 局部变量释放后是否会清除栈的值?

答:不会,基于Ifx TC277验证
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值