您的位置:首页 > 编程语言 > C语言/C++

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

2017-02-17 08:33 513 查看

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、野指针、通用指针
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C-C++
相关文章推荐