c++关于指针与引用的总结:
指针
1、指针变量:int * p p对应的内存中保存的是变量的地址 2、空指针:指向内存中地址为0的指针,不可以访问,可用作指针初始化(0~255系统使用) 3、野指针:指针变量指向非法空间的(不可访问空间)指针 4、数组指针:指向数组第一个元素地址(数组变量本身也是指向第一个元素的地址) 5、常量指针:const int * p 指针的值可以修改(指针的指向可以修改),指针指向的值不可以修改(指针解引用的值不能修改)~ const修饰的是类型 int所以对应变量的值 6、指针常量:int * const p 指针的值不可以修改(指针的本身的值即指向的地址不可以修改),指针指向的值可以修改(解引用的值可以修改)~ const修饰的是变量p,变量p的内容是地址
引用
1、引用:变量的别名 int &b = a/ int &b = test()(数据类型 &别名 = 变量原名),别名与变量原名指向同一块内存空间,引用定义必须初始化并且初始化就不能再修改(已经指向变量a即已经是a的别名,就不可以重新作为b的引用即不可以再是b的别名,但是可以赋值) 2、引用简化了指针类型的形参(引用作为形参其实是传入实参的别名,函数内修改引用会同时影响外面的实参) 3、引用可以作为返回值如(int& test(){})不要返回局部变量的引用(局部变量存在栈上,作用域执行结束即被回收) 4、如果引用作为函数的返回值(根据3来讲,可以返回全局的/static类型的变量的引用),则函数调用可以作为左值(这里其实修改的还是对应变量的引用,指针应该也可以达到这种目的) 5、引用的本质是一个指针常量( int &d = a; 内部其实是int * const ref = &a 指针的值不可改变即指针变量的值不可改变,但是指针指向的值可以改变,引用赋值 d = 20 本质其实是解引用,此时d = 20 相当于*ref = 20),这也解释了引用一旦初始化就不可以再作为别的变量的别名,这个工作是编译器转换的 6、常量引用(引用的本质是指针常量,指针变量的值可以改变,但是指针指向的值不能修改,由于引用本身就是一个指针常量 int * const p 所以常量引用即为const int * const p 即不可修改指针的值,也不可以修改指针指向的内容,利用这个特性可以保护函数形参不被函数内部修改)void test(const int& ){} 可以理解为内部转换为void test(const int * const v){} 7、引用必须引用一块合法的内存空间(不可以是字面量 int & ref = 10是错误的 等同于 int * const ref = 10 此时10是字面量不可修改而 左值为指针常量,指针常量可以修改指向的值,编译器会报错,此时修改为const &ref = 10是正确的,const &ref等同于const int * const ref = 10,左右都是不可修改的也可以理解为编译器创建了临时变量int tmp = 10 int &ref = temp) ps:主要使用场景~修饰形参防止误操作(函数内部修改了外部变量)这种传参方式,一防止修改外部数据,二可以避免值传递发生拷贝提升效率
|