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