码迷,mamicode.com
首页 > 其他好文 > 详细

2.3复合类型

时间:2017-10-01 16:20:20      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:指针   64位   引入   初始化   之一   介绍   64位系统   tip   访问   

2.3.1引用

在C++11标准中,增加了一个右值引用,稍微高级的东西,以后会更新。

一般来说引用都是说的左值引用。

这里就有一个问题,什么是左值,什么是右值。

简单一句话:左值长久,右值短暂

引用其实就是给对象起了另一个名字。

如:

  int ival = 0;

  int &refVal = val; //refVal就是引用,是ival的别名

因此,既然是别名,我们就可以通过改变别名,来改变对象。

  refval = 20; //此时ival就等于20

可以测试refVal和ival的地址,我测试的时候地址都为0x7fff5fbff9c8,这里也可以看出来两者其实在内存中位置一样。

注意:引用必须初始化。想想就明白了,既然是给对象起的别名,那么肯定要有个对象啊,不然怎么起别名?

但引用本身不是对象,它只是一个别名

特别的:引用在传参数上有极大的用处

 

2.3.2指针

对于一个C/C++程序员来说,指针这个东西非常重要。。。但是也很头疼,稍不注意就内存就GG。

指针也是一种复合类型,但是指针与引用不同:

1.指针本身就是一个对象,允许对指针赋值和拷贝

2.指针不用在定义时就给初值,如果指针在块作用域内没有被初始化,就将拥有一个不确定的值。

 

指针声明用*:

  int *ptr1, *ptr2; //ptr1和ptr2都是指向int对象的指针

指针指向某个对象的地址:要想获取该地址,需要使用取地址符&

  int ival = 0;

  int *p = &ival; //p存放了ival的地址,也就是p指向了ival

注意:指针的类型要和指针所指的类型匹配

指针的值应该属于下面4中状态之一:

  1.指向一个对象

  2.指向紧邻对象所占空间的下一个位置

  3.空指针,意味着指针没有指向任何对象

  4.无效指针

试图拷贝或以其他方式访问无效指针的值会引发错误,编译器也不会检查这种错误,因此必须清楚知道指针是否有效。

 

访问对象用解引用符*:除了声明指针用*外,其余位置使用*都为解引用

  int ival = 0;

  int *ptr = &ival;

  cout << *ptr; //输出0

对指针解引用会访问指向的对象,因此如下:

  *ptr = 10;

  cout << *ptr << " " << ival; //输出结果都为10

 

空指针:空指针不指向任何对象,优秀的做法是使用一个指针之前检查它是否为空

  int *ptr1 = nullptr;  //等于int ptr1 = 0,nullptr是C++11新标准引入的方法,是一种特殊类型的字面值,可以被转化为任意其他指针类型

  int *ptr2 = 0;    //直接将p2初始化为字面常量0

  int *ptr3 = NULL;  //等于int *ptr3 = 0

Tips:建议初始化所有指针,详情见Effective C++条款4中描述和C++primer P49

 

void* 指针:是一种特殊指针,可用于存放任意对象的地址。但是我们不能了解改地址到底是什么类型对象。

注:任何类型指针在32位系统中都为4字节大小,在64位系统中为8字节大小,指针和数组关系很大,后面介绍,指针深入理解也可以看看深入理解计算机系统

 

2.3复合类型

标签:指针   64位   引入   初始化   之一   介绍   64位系统   tip   访问   

原文地址:http://www.cnblogs.com/CoderZSL/p/7617310.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!