# `cpp`基本知识
## 指针与引用的区别
## 函数相关
### 双冒号
1. 指定作用域 前面是作用域等类名称,后面接类的成员名称
例: A,B表示两个类,A,B中都有成员numb
    A::numb
    B::numb
2. 指定全局作用域的变量
例: 指定 使用全局变量或者局部变量
```cpp
#include <stdio.h>

int count = 0; //全局变量 0

void main()
{
 
 int count = 10; //局部变量10
 
 printf("count =%d\n",count);//局部变量屏蔽了全局变量 所以输出结果是10
 {
  int count = 20;
  
  printf("count =%d\n",::count); //作用域符号指出引用全局变量0
  //::sort
 }
}
```
3. 另外,双冒号也常常用于在类变量内部作为当前类实例的元素进行表示
例:
```cpp
class CA {
public:
  int ca_var;
  int add(int a, int b);
  int add(int a);
};
 
//作用域
int CA::add(int a, int b)
{
  return a + b;
}
 
//另外,双冒号在类变量内部作为当前类实例的元素进行表示
int CA::add(int a)
{
  return a + ::ca_var;
}
``` 
> 引用和地址的区别
> 前者好像类似于变量别名.  无论怎么变还是那个名字,
> 后者是面向名字背后对应的那个人.
## `&`符号的作用
### 引用声明符
> 给一个变量声明另一个名字,相当于别名作用?
> b相当于a的一个别名
```c++
int a;
int &b=a;
``` 
## 地址赋值运算符
> & 变量名 //获得该变量在内存中的地址  
> Int *p=&a  //定义整形指针变量,并将a的地址赋值给指针变量。

### 变量的地址
> 变量的地址就是变量在内存中的位置,可以通过&运算符来获取变量的地址
### `#e` 获取地址 | `*` 获取地址中的值
```c++
int a;
int b = &a;//得到a变量申请的地址
```


## `*`符号的作用
### 指针声明符
#### `#d` 获取变量的`地址`
用于声明一个指针变量,指针变量存储的是一个地址,这个地址指向的是另一个变量  
#### `#e` 获取变量的`地址`
```c++
int a;
int *p=&a; //定义整形指针变量,并将a的地址赋值给指针变量。
```
#### `#d` 从地址中取值
可以从一个指针变量中获取对应的值
#### `#e` 获取地址中的值
```c++
int a;
int *p=&a;
printf("%d",*p); //输出a的值
```
### 指针函数
#### `#d` 函数返回 `地址`
函数的返回值是一个`地址`
#### `#e` 函数返回 `地址`
```c++
int *fun()
{
    int a=10;
    return &a;
}
int main()
{
    int *p=fun();
    printf("%d",*p);//输出10
    return 0;
}
```

### 函数参数
#### `#d` 函数参数是 `地址`
函数的参数是一个`地址`,函数内部可以通过这个地址来修改外部的变量
#### `#e` 函数参数是 `地址`
```c
void fun(int *p)
{
    *p=20;
}
```

### & 与 * 的区别
#### `#d` & 获取地址 | * 获取地址中的值
&是取地址运算符,*是取值运算符
#### `#e` & 获取地址 | * 获取地址中的值
```c++
int a;
int *p=&a;
printf("%d",*p); //输出a的值
```
## `#d` 指针的运算
### `#e` 指针的运算
```c++
int a=10;
int *p=&a;
p=p+1;
printf("%d",*p);//输出a的下一个地址的值
```


### sizeof
#### `#d` 获取变量的大小
```c++
int a;
int *p=&a;
printf("%d",sizeof(p));//输出4
```