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;
重点:作用在引用上的所有操作事实上都是作用在该引用所绑定的对象上。
使用引用有何优点?
在传参的时候,使用指针传参,编译器需要给指针另行分配存储单元,存储一个该指针的副本,在函数中对这个副本进行操作;而使用引用传参,编译器就不需要分配存储空间和保存副本了,函数将直接对实参进行操作。所以使用引用使得程序的运行速度更快,执行效率更高。