C/C++【初级】之一 指针(*)、取地址(&)、解引用(*)与引用(&)的概念

1.引用注意事项:

1.引用必须被初始化;
2.引用一旦与初始值对象绑定,就不会变化(引用从一而终)!!!
3.引用初始值必须为一个对象,不能使常数
4.引用必须与被引用的对象类型一致

示例1:

    /*——————————————————————————————
    示例01:关于 & 引用 
    ——————————————————————————————*/ 
    int val = 100;
    int &refval1 = val;             // &refval是引用,以i为别名 
    int &refval2 = refval1;         // refval2与refval共同绑定在val上 

    //int &refval3;                 // error:引用必须初始化
    //int &refval4 = 10             // error :引用的初始值必须为一个对象 
    //double dval = 3.14;
    //int &refval5 = dval;          // error:引用必须与要引用的对象类型一致,应为int 

    cout <<  "示例1:\n"; 
    cout <<  "val:        " << val << endl;  
    cout <<  "refval1  = :" << refval1 << endl;
    cout <<  "&refval1 = :" << &refval1 << endl; 
    cout <<  "refval2  = :" << refval2 << endl; 
    cout <<  "&refval2 = :" << &refval2 << endl; 
    cout << "\n";
    refval2 = 10;                       // 给引用对象重新赋值 ,相当于给【val = 10】 赋值 
    cout <<  "val:        " << val << endl; 
    cout <<  "refval1  = :" << refval1 << endl;
    cout <<  "&refval1 = :" << &refval1 << endl; 
    cout <<  "refval2  = :" << refval2 << endl; 
    cout <<  "&refval2 = :" << &refval2 <<endl; 

    cout <<  "\n"; 
    cout <<  "refval1、refval2 都是引用的val的值,所以他们的地址相同" << endl; 
    cout <<  "\n"; 
}

2.定义个简单的指针

指针注意事项:
1.避免声明一个指向NULL的指针;

string *ps; // 未初始化的指针 // 合法但危险 

示例2:

    /*——————————————————————————————
    示例02:关于  指针(*)
    ——————————————————————————————*/ 
    int val2 = 100;
    int *ptr2 = &val2; // *ptr定义了一个int型的指针,指向了val所在的内存地址 

    cout <<  "示例2:\n"; 
    printf("val2指针所在地址 16进制:%x",ptr2) ;
  cout <<  "\n"; 

3.指针(*)、取地址(&)、解引用(*)与引用(&)的概念

示例3:

    /*——————————————————————————————
        示例03:关于  指针(*)、取地址(&)、解引用(*)与引用(&)的概念
    ——————————————————————————————*/ 

    int val3 = 100; 
    int &value3 = val3;   // 定义一个【引用】 
    int *ptr3 = &val3;   // 定义一个【指针】 

    int *&refp3 = ptr3;    //将一个【指针引用】和一个指针绑定起来,那么refp就是一个【指针引用 】 

    cout <<  "示例3:\n"; 
    cout << "val3 的值:                        " << val3 << endl;
    cout << "value3 的值:                      " << value3 << endl;

    cout << "val3所指向的内存地址       &val3 : " << &val3 << endl;  // 【取地址】 
    cout << "指针ptr3所指向的内存地址   ptr3  : " << ptr3 << endl;       // 
    cout << "对*ptr3指向的内容的取地址  &*ptr3: " << &*ptr3 << endl;  // 【注意:ptr3 = &val3 = &*ptr3 】 

    cout << "获取指针ptr3指向地址的内容 *ptr3 : " << *ptr3 << endl;   // 【解引用】 
    cout << "获取指针ptr3的地址         &ptr3 : " << &ptr3 << endl;
    cout << "\n" ;

    cout << "获取指针引用refp3 的地址   refp3 : "<< refp3 << endl;   // 【指针引用refp】同样指向 
    cout << "\n" ;

    cout << " (&)取地址 和 (*)解引用* 互为反向操作因此,可以推理出,&*&*ptr依旧还是val的地址:\n" << &*&*ptr3 << endl; 

重点:作用在引用上的所有操作事实上都是作用在该引用所绑定的对象上。

使用引用有何优点?

  在传参的时候,使用指针传参,编译器需要给指针另行分配存储单元,存储一个该指针的副本,在函数中对这个副本进行操作;而使用引用传参,编译器就不需要分配存储空间和保存副本了,函数将直接对实参进行操作。所以使用引用使得程序的运行速度更快,执行效率更高。

C++指针注意事项

C++指针详解

【C/C++学习】之一、指针和引用的区别

【C/C++学习】之十一、指针一些事

【C/C++学习】之十六、关于空指针NULL、野指针、通用指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值