标签:指针 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字节大小,指针和数组关系很大,后面介绍,指针深入理解也可以看看深入理解计算机系统
标签:指针 64位 引入 初始化 之一 介绍 64位系统 tip 访问
原文地址:http://www.cnblogs.com/CoderZSL/p/7617310.html