C++学习笔记(一)——引用和指针

C++学习笔记(一)——引用和指针

一、引用

  • (1)引用即别名,不是对象;
    引用:给对象起了另外一个名字

  • (2)引用和初始化绑定,而不是拷贝;

  • (3)引用必须初始化;
    int &a; //错误 引用必须被初始化

  • (4)引用不是对象,不能定义引用的引用;

    //这是合法的,不是引用的引用
    int a;
    int &b = c;
    int &a = b;
    
    //这才是引用的引用,是错误的
    int &(&a);
    
  • (5)引用的初始化值必须是对象,不能与字面值或者某个表达式的结果绑定在一起,数据类型且一致

    int &a = 10;//这是错误的 
    后面会用到const int &a = 10;//这是正确的
    double b = 1;
    int &c = b; //这是错误的,引用类型必须是int类型
    
  • (6)引用不是对象,不能定义指向引用的指针
    指针的定义中说到:指针的值(即地址)必须指向一个对象。

二、指针

  • (1)指针本身就是一个对象,允许对指针复制和拷贝;

  • (2)指针无需在定义时赋初值;

  • (3)获取对象的地址,用到取地址符&

    int a = 2;
    int *p = &a; //p存放a的地址,或p指向变量a的指针
    
  • (4)因为引用不是对象,没有实际地址,所以不能定义指向引用的指针;

  • (5)指针值(4种状态):
    1.指向一个对象
    2.指向紧邻对象所占空间的下一个位置
    3.空指针,意味着指针没有指向任何对象
    4.无效指针,上述之外的值

  • (6)空指针
    三种写法:

    int *a = nullptr;  //C++11推荐这种写法 (特殊类型的字面值)
    int *b = 0;
    int *c = NULL; //NULL(预处理变量)值为0
    

    预处理变量不属于命名空间std::
    nullptr它可以转换成任意其他的指针类型,C++程序中最好使用nullptr,避免使用NULL
    注意:
    int变量直接赋值给指针是错误的操作,及时int值恰好为0也不行

  • (7)指针和引用的区别
    指针和引用都能提供对其他对象的间接访问;
    具体细节上有很大不同:
    引用本身并非一个对象;
    一旦定义了引用,就无法令其再绑定到其他的对象,之后每次使用这个引用都是访问最初绑定的那个对象。

  • (8)其他指针操作

    int *p = 0;
    if(p) // pi的值为0,false
    {
    }
    
  • (9)void * 指针
    void * 是一个特殊的指针类型,可以用于存放任意对象的地址。
    ==不能直接操作void * 指针所指向的对象,因为我们并不知道这个对象到底是什么类型,也无法确定能在这个对象上做哪些操作。==需要进行强制类型转换操作,表明该void*指针所指对象的类型才能使用。

    int i =1;
    void *p = &i;
    cout << *((int*)p) << endl; // 需要进行强制类型转换操作,才能对void *类型操作
    
  • (10)定义多个变量

    int* p1, p2; // p1指向int的指针,p2是int
    //(1)
    int *p1, *p2;
    //(2)
    int* p1;
    int* p2;
    
  • (11)指向指针的引用
    引用本身不是一个对象,所以不能定义指向引用的指针。
    但是指针是对象,所以存在对指针的引用

    int i = 5;
    int *p;
    int *(&r) = p; //r是对指针p的引用
    // 相当于 r = p 了
    r = &i; //*r 现在等于5
    *r = 0// i的值现在也是0了
    

    int *(&r) = p; 从右向左阅读 ,符号 * 修饰(&r),告诉我们 r引用的是一个int类型指针

  • (12)指针不能指向不同类型的对象

    double val = 3.4;
    int *a = &val; //error C2440: “初始化”: 无法从“double *”转换为“int *”
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值