一、指针:

(1)如果对指针进行解引用操作 赋值,改变的是指针所指向对象的值;
(2)如果不对指针进行解引用操作 赋值,则改变的是指针本身的值;
(3)指向const对象的指针:也叫指针常量,表示指针所指向的对象是const类型的,不允许通过解引用修改其所指向的值。如代码片段2所示。

需要注意的是:指向const对象的指针不能通过解引用修改其所指向的对象的值;不能用const类型的地址初始化普通的,非const类型的指针;可以使用非const的地址初始化const类型的指针;可以用const类型的地址初始化const void *指针,而不能初始化void *指针。

(4)const指针:表示声明的指针是const类型的,不允许修改指针的值,但可以通过解引用修改指针所指向对象的值。跟const变量类似,const指针必须在声明的时候初始化。

例如:

代码片段1:

string s1("some value");
string *sp1 = &s1;//此时s1的值为“some value”,指针sp1指向s1 string s2("another");
string *sp2 = &s2;//此时s2的值为"another",指针sp2指向s2 *sp1 = "a new value";//此时s1的值为"a new value",指针sp1指向s1
sp1 = sp2;//此时指针sp1指向s2

代码片段2:

 const int *cptr;
*cptr = ;//error,不允许通过解引用修改指针所指向的对象的值 const double dv = ;
double *dptr = &dv;//error,不能使用const类型的地址赋给非const类型的指针 double dv2 = ;
const double *dptr2 = &dv2;//非const类型的地址可以赋给const类型的指针 const int intValue = ;
void *vptr = &intValue;//error
const void *vptr2 = & intValue;//ok
13
14 const int *iptr;
15 int const *iptr2;// 14行和15行声明的指针是等价的,表示指针所指向的对象是const的,不能通过解引用修改,但指针本身的值是可以修改的
16 int *const *iptr3;//表示iptr3是const指针,指针的值不允许修改,但是可以通过解引用修改指针所指向对象的值

二、引用:

(1)定义引用时必须初始化。

(2)引用一经初始化,就始终指向特定的对象,如果给引用赋值,则修改的是引用所关联对象的值。

(3):非const类型的引用只能用该引用同类型的对象初始化,不能使用右值

(4):const类型的引用既可以使用右值初始化,也可以使用不同但相关类型的对象初始化

(5):const类型的引用一经初始化完成就不能修改引用的值

代码片段3:

int i1 = 1000,i2 = 2000;
int *s1 = &i1, *s2 = &i2;
s1 = s2; 结果:s1所指向的i1的值不变,赋值操作结束后,只是改变了指针s1本身的值,即s1指针指向另一个不同的对象。

代码片段4:

int &s1 = i1, &s2 = i2;
s1 = s2; 结果:赋值操作修改了s1所关联对象i1的值,而不是引用本身的值。赋值结束后,引用s1和引用s2还是分别指向原来对象,只是此时两个对象的值相等。

代码片段5:

     int v1 = ;
int &rv1 = v1; rv1 = ;
cout<<"rv1 = "<<rv1<<" v1 = "<<v1<<endl;//rv1 = 12 v1 = 12 //int &rv2 = 10;//error,不能直接使用右值初始化引用
double dValue = 10.0; //int &rv3 = dValue;//error,只能用与引用同类型的对象初始化引用 const int &rv4 = dValue;//ok const int &rv5 = ;//ok

给出比较全的代码:

#include <iostream>
using namespace std; int main(){ float s1 = 100,s2 = 200;
cout<<"原始两个值: "<<s1 << " "<<s2<<endl; float *sp1 = &s1, *sp2 = &s2;
cout<<"第一次操作后的两个值: "<<s1 << " "<<s2<<endl;
cout<<"两个指针的值 sp1 = "<<*sp1<<" sp2 = "<<*sp2<<endl;
cout<<"-----------------------------"<<endl; //对指针进行解引用,改变了指针所指对象s1的值,由100变为10,对应上面指针理论(1)
*sp1 = 10;
cout<<"第二次操作后的两个值: "<<s1 << " "<<s2<<endl;
cout<<"两个指针的值 sp1 = "<<*sp1<<" sp2 = "<<*sp2<<endl;
cout<<"-----------------------------"<<endl; //不改变指针所指对象s1的值,改变了指针本身的值,此时指针sp1指向sp2,对应上面指针理论(2)
sp1 = sp2;
cout<<"第二次操作后的两个值: "<<s1 << " "<<s2<<endl;
cout<<"两个指针的值 sp1 = "<<*sp1<<" sp2 = "<<*sp2<<endl;
cout<<"-----------------------------"<<endl; //此时改变指针对象s2的值,同时指针sp2的值也改变
*sp1 = 15;
cout<<"第三次操作后的两个值: "<<s1 << " "<<s2<<endl;
cout<<"两个指针的值 sp1 = "<<*sp1<<" sp2 = "<<*sp2<<endl;
cout<<"-----------------------------"<<endl;
cout<<""<<endl; float &i1 = s1, &i2 = s2;
cout<<"第四次操作后的两个值: "<<s1 << " "<<s2<<endl;
cout<<"两个引用的值 s1 = "<<s1<<" s2 = "<<s2<<endl;
cout<<"-----------------------------"<<endl; //对引用赋值改变的是引用所关联对象的值
i1 = 30;
cout<<"第四次操作后的两个值: "<<s1 << " "<<s2<<endl;
cout<<"两个引用的值 s1 = "<<s1<<" s2 = "<<s2<<endl;
cout<<"-----------------------------"<<endl; //此时只是改变了i1引用所关联对象s1的值,只是引用i1和i2还是分别指向各自的对象,只是各自对象的值相等。
i1 = i2;
cout<<"第五次操作后的两个值: "<<s1 << " "<<s2<<endl;
cout<<"两个引用的值 s1 = "<<s1<<" s2 = "<<s2<<endl;
cout<<"-----------------------------"<<endl; return 0;
}

后续更新中......

C++学习基础二——指针与引用的区别的更多相关文章

  1. C++ 中指针与引用的区别

    指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...

  2. 指针和引用的区别(c/c++)

      http://blog.csdn.net/thisispan/article/details/7456169 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用 ...

  3. C程序设计语言--指针和引用的区别

    在看了一篇文章以后,http://coolshell.cn/articles/7992.html,说的是C和C++之间的缺陷,当然这篇文章说的非常高深了.所以就找了一些资料,分析了这两者的区别 在&l ...

  4. c++ 浅拷贝和深拷贝 指针和引用的区别 malloc(free)和new(delete)的区别 重载重写重定义

    4.malloc(free)和new(delete)的区别 malloc()函数: 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void ...

  5. c++值传递,指针传递,引用传递以及指针与引用的区别

    值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...

  6. 转贴:C++中指针和引用的区别

    从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有 ...

  7. 【C++】指针与引用的区别

    本文主要总结在C++中指针与引用的区别. 从定义与性质来看指针与引用有如下区别: 指针表示的是一块变量的地址 引用表示一个变量的别名. 因此指针变量需要占用空间(一个指针变量在32位系统下占用4字节, ...

  8. 转 浅谈C++中指针和引用的区别

    浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别   指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性 ...

  9. C++指针和引用及区别

    1.变量 首先最重要的,variable的定义,当你申明一个变量的时候,计算机会将指定的一块内存空间和变量名进行绑定:这个定义很简单,但其实很抽象,例如:int x = 5; 这是一句最简单的变量赋值 ...

随机推荐

  1. CSS简单布局总结

    display  block       块级元素,占据一行 none       隐藏 inline      允许同一行显示,但不再有宽和高 inline-block   允许在一行的块级元素,可 ...

  2. C# 不同版本切版时,方法不支持,加载对应dll, 相关Dll的资源

    不过,有些高版本有的DLL,低版本运行时,需要引用相关DLL.我们不用在网上去下载 下面的路径,查找对应版本下的DLL,可能会给你意想不到的收获哦 C:\Program Files\Reference ...

  3. HDU 4352 XHXJ's LIS

    奇妙的题. 你先得会另外一个nlogn的LIS算法.(我一直只会BIT.....) 然后维护下每个数码作为结尾出现过没有就完了. #include<iostream> #include&l ...

  4. NSFetchedResultsControllerDelegate不执行

    熬了2  ,3个小时 才解决这个问题 在进行IM 设置时候 NSFetchRequest *request=[NSFetchRequest fetchRequestWithEntityName:@&q ...

  5. 简便删除已经存在的oracle数据库用户UPAY3LINGXI_YS

    简便删除已经存在的oracle数据库用户UPAY3LINGXI_YS:1.Toad工具用oracle最大权限用户登录system2.查看正在使用UPAY3LINGXI_YS的进程select * fr ...

  6. HDU 2177

    http://acm.hdu.edu.cn/showproblem.php?pid=2177 威佐夫博奕,面对奇异局势既bk=ak+k时是必败点,其中bk>=ak,k=bk-ak 别的处理和其他 ...

  7. 12-8下午 php语法

    <?php //var_dump(empty($a)); //判断变量是否为空//var_dump(isset($a)); //判断变量是否定义//$a = 10;//unset($a); // ...

  8. Smart210学习记录-----Linux i2c驱动

    一:Linux i2c子系统简介: 1.Linux 的 I2C 体系结构分为 3 个组成部分: (1) I2C 核心. I2C 核心提供了 I2C 总线驱动和设备驱动的注册.注销方法,I2C 通信方法 ...

  9. WampServe修改默认网站目录的方法(转)

    1wamp简介 WampServe集成了Apache.MySQL.PHP.phpmyadmin,支持Apache的mod_rewrite,PHP扩展.Apache模块只需要在菜单“开启/关闭”上点点就 ...

  10. 不让padding影响元素的宽度

    CSS3 新增了 box-sizing 属性. 以前,如果指定 div 的宽度为 div { width: 100px; height: 100px; padding: 10px; } 则包含 pad ...