C/C++

2023-12-24 16:42:11

关键字

#和##
  1. #:字符串化操作符
    宏定义中的传入参数名转化成用一对双引号括起来参数字符串。
  2. ##:符号连接操作符
volatile

加上这个关键字,是防止编译器去做优化的操作。
三个例子:
1.并行设备的硬件寄存器
在读写的时候,需要告诉这个变量是不稳定的,编译的时候不需要优化。(不需要优化的意思就是去特殊地址去访问它)。

2.中断服务程序中修改的供其它程序检测的变量,需要加volatile
当变量在触发中断中修改,而编译器判断主函数里面没有修改该变量,因此可能只执行一次从内存到寄存器的读操作,而后每次只会从该寄存器中读取变量副本,使得中断程序的操作被短路。

3.多线程应用中被几个任务共享的变量,应该加上volatile:

在这里插入图片描述
对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,编译器会逐一的进行编译并产生相应的机器代码(产生四条代码)。

static

可以从两个点去回答:

  1. 一个静态局部变量,在函数体内,只会初始化一次(具有记忆功能),可参考这个例子。链接: link在函数调用中是维持初始化不变的。
    2.另外一点事全局静态变量,在函数体外,作用的范围是该.c文件下的所有的函数访问,但是不能被外部.c文件访问。

它在函数内的话,一般函数内的话一般声明周期会很长,与程序同生死。和函数内的局部变量是不同的,局部变量存储在栈中,一旦函数调用结束,就立刻销毁了。

auto

只能用来标识局部变量的存储类型,对于局部变量,auto是默认的存储类型,不需要显示的指定。因此,auto标识的变量存储在栈区中。

const
  1. 概念:
    常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。

  2. 与define的区别
    第一,const常量一般是有数据类型的,编译器可以做安全检查;但是define是没有类型的,它是一种简单的替换方法,编译器不能做安全检查。
    第二,在内存分配上,const是给出的是对应的内存地址,而define是一个立即数。程序运行中,const定义的常量只有一份拷贝,但是define定义的常量在内存中有若干拷贝。

内存

内存分配有哪些?

什么是内存泄漏

内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。

指针

  1. 指针数组与数组指针的区别
    指针数组:链接: link

    数组指针:链接: link
    在这里插入图片描述

  2. 函数指针与指针函数
    2.1 函数指针:
    如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针

    int(*p)(int, int);
    p = MAX;
     
    int MAX(int x ,int y);
    

2.2 指针函数:
首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有“函数返回值”,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。

      int *pfun(int, int);

指针和引用

待整理……

文章来源:https://blog.csdn.net/qqmrchen124/article/details/135180778
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。