问题

什么是宏?

  • 函数宏 ```cpp

    include

    define MIN(A, B) (A < B ? A : B)

    define TYPE(type, name) type name##_##type##_type

    int a = MIN(1, 2); // TYPE(int, a) => int a_int_type int main() { printf(“%d”, a); printf(“Hello, World!”); return 0; }
  1. - 对象宏
  2. ```cpp
  3. #define PI 3.14

作用:
在有数据结构体的时候,可以实现防止每个接口执行一次,减少工作量。

是一种分割链接方式,它的作用是先分隔,然后进行强制连接

注意:

  • 尽量用cost,enum,inline替换define

define编译时错误信息有问题.
如果是定义常量字符串,则必须要 const 两次,目的是为了防止指针所指内容和指针自身不能被改变

const char* const name = "test";

//  定义常量
class Stdudent {
  private: 
    static const int num = 10;
    int scores[num];
};

const int Student::num; // static 成员变量,需要进行声明

// 
class Student {
  private: 
    enum: { num: 10 };
    int scores[num];
}
  • 用enum 代替#define
  • 用 inline 替换#define ```cpp // 与预期不符合 int a = 6, b = 5; int max = MAX(a++, b); std::cout << max << std:: endl; std::cout << a << std::endl;

// template inline T max(const T& a, counst T& b) { return a > b ? a: b; }

<a name="Ai6iL"></a>
### 动态链接库是?
在Nodejs中引入一个C++模块的过程,实际上Node.js在运行时引入了一个动态链接库的过程。<br />*.node后缀,十六进制打开后,文件头的标识位是0x7F454C46,ASCII码是指不可见空字符(ASCII码为0x7F)后面跟着“ELF”,这就是一个Linux动态链接库的标识

<a name="U8z7I"></a>
### <<,>>的作用
输入输出流或者位运算<br />endl代表换行<br />count是ostream类的对象<br />cin是istream类的对象

流【Stream】      Operator【操作符】    Functions【函数】<br />cin                            >>                            cin.get 从流中读取并取走一个字符<br />                                                                 cin.getline()从流中读取字符,直至行尾或指定的分隔符<br />                                                                 cin.ignore()从流中读取并舍弃指定数量的字符<br />cout                          <<                           cout.put()将字符写到流中【无格式】<br />                                                                 count.flush() 将流中的缓存内容全部输出

```cpp
流提取运算符


流插入运算符
<<

指针

一个变量,存储另一个变量的地址

  • 定义指针

    int a = 0;
    int * p;
    p = &a;
    
  • 所占用内存空间

32位操作系统,4个字节;64位操作系统,占8个字节空间;

cout << sizeof(int *) << endl;
  • 空指针和野指针

不是申请的空间,不能访问
空指针
定义: 内存编号为0 的空间
用途:初始化指针变量
注意: 指向的内存不可以访问
0~255之间的内存编号是系统占用,不可访问

int * p = NULL;
*p = 100; // nullptr

野指针
定义:指向非法的内存空间
内存地址没有申请是不可以访问的

int * p = (int *)0x1100;
cout << *p << endl;

const 修饰指针

  1. const修饰指针 - 常量指针
  2. const修饰常量 - 指针常量
  3. const修饰指针,又修饰常量

常量指针 const int p = &a 指向的值不可以修改
指针常量 int
const p = &a 值可以改,指向不可以变
指针的指向和值都不可以修改

  • 指针数组 ```cpp int arr[] = {1,2,3,4,5} int p = arr; for (int i = 0; i < 10; i++) { cout << p << endl; *p++; } // +1可以进行偏移

- 指针和函数
```cpp
// 利用指针进行地址转递
void swap(int * a, int * b) {
    let temp = *a;
    int 
}

数据结构体

typede struct {
   int temp = *a;
  int *a = *b;
  int *b = temp;
}
int a = 10;
int b = 20;
swap(&a,&b);

.cc与.cpp

unix系统中常用.cc,非unix系统常用.cpp
.h头文件

算法应用

数组中找出重复的值

数组中找出重复的值,不改变原有的数组情况下