Pointers与References(一)

译者注:本文节选自《How to Think Like A Computer Scientist,Learning with C++》 第16章,作者Allen B. Downey)。此书对于国内“初级”C++爱好者来说,是一本 不可多得的入门书籍。我的这版是PALM电子书。

正文:

我认为最简单的方法解释Pointers 和 References就是举例证明了。首先让我们看一些表 达式:x=1;  在表达式中,当你使用一个变量,特别是一个字母或标记符来 存储数据。在编程过程中,上面等式中的变量一定是在等号的左边。

你可能已经注意到了编译器不充许你像这样写代码:1=x;

假如你不知道,你现在应该知道,并且理解它,这是最关键的。当你得到编译运行期错误 ,如:"lvalue requied in ..."是因为等号左边通常被当作lvalue的值,必须是 内存中的一个地址。

让我们想一想。假如你想存储数据,在存储数据操作之前知道在哪里存储。lvalue值就是 在内存里的一段地址,来存放你的信息或等号右边的数据,同理的还有rvalue值。

在C++中,你将经常这样或那样涉及内存管理。操作地址,C++有两种机制:Pointers 和 References。

16.1 什么是Pointers和 References

Pointers和 References是特殊变量,以存储内存地址当作它们的值。在你学会这些之前 ,其它相关的不同类型的数据类型还有:

int,double和char。Pointers和 References存放着已经声明并赋值的,不同数据类型的 ,你所操作数据的地址。这两种机制 Pointers 和 References,有着不同的语法和不同的惯 性使用方法。

16.2 声明Pointers和 References

当对一个对象或数据类型的指针进行声明时,你照例地使用声明变量和数据类型的方法, 仅是现在,对于声明SOMETYPE的指针,你需要在数据类型和它的变量之间加上星号*。

SOMETYPE* sometype;
int* x;

对于声明一个reference,你做的事情是和声明一个指针完全一样的,仅仅这次你不使用 星号*,使用—来替换。

SOMETYPE& sometype;
int& x;

可能你已经学过,空位在C++中是不被考虑的,所以以下的指针声明都是一样的效果:

SOMETYPE* sometype;
SOMETYPE * sometype;
SOMETYPE  *sometype;

以下的references声明同理也是一样:

SOMETYPE& sometype;
SOMETYPE & sometype;
SOMETYPE  &sometype;

时间: 2024-11-02 10:39:45

Pointers与References(一)的相关文章

Pointers与References(二)

16.4 赋值pointers和references. 就像你看到使用"寻址"操作符的语法一样,一个指针被赋值得到"寻 址"操作符的返回值.因为"寻址"操作符的返回值就是一个指针,所有事 情 都考虑过了,你的代码应该通过编译.对于赋值给一个指针,它必须在内存中得到一个地 址,不然编译器将给你提示错误. int x; int* px = &x; 上 面一段代码说明了被声明为int类型的变量x,一个被声明为指针的变量并给赋值内存中x的地 址.

Pointers与References(四)

16.7 从函数中返回指针和/或引用 当声明一个函数,你必须按类型规则声明,并返回它.比如: int MyFunc(); // 返回int类型 SOMETYPE MyFunc(); // 返回SOMETYPE类型 int* MyFunc(); // 返回int类型指针 SOMETYPE *MyFunc(); // 返回SOMETYPE类型指针 SOMETYPE &MyFunc(); // 返回SOMETYPE类型reference   噢,我的孩子,我不 想深入讨论它.但是我确信假如你理解了指针

Pointers与References(三)

16.5 空指针 还记得可以怎样指定一个字符或串为 null 吗? 如果记不得了, 看看这里吧.串中的 null 字符表示串的结尾, 但是, 如果一个指针被指定到 null 指针, 则它什么也没有指向. 空指针常常用 0 或 null 结束.空指针常常用于逻辑操作中的 and/or 条件中 #include <iostream.h> int main() { int x = 12345; int* px = &x; while (px) { cout << "指针

【C++注意事项】4 指针 Pointers

和上一节的引用类似,指针(pointer)是"指向(point to)"另外一种类型的复合类型.与引用类似,指针也实现了对其他对象的间接访问.然后指针和引用相比有许多不同.其一,指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象.其二,指针无须在定义时赋初值.和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值. 因为引用不是对象,没有实际地址,所以不能定义指向引用的指针. 指针的值(即地址)应属下列4种状态之一

STL之七:STL各种容器的使用时机详解

    C++标准程序库提供了各具特长的不同容器.现在的问题是:该如何选择最佳的容器类别?下表给出了概述. 但是其中有些描述可能不一定实际.例如:如果你需呀处理的元素数量很少,可以虎落复杂度,因为线性算法通常对元素本身的处理过程比较快,这种情况下,"显性复杂度搭配快速的元素处理"要比"对数复杂度搭配慢的元素处理"来得划算.     作为对上表的补充,使用时:     1.缺省情况下应该使用vector.vector的内部结构最简单,并允许随机存取,所以数据的存取十分

STL各种容器的使用时机详解

  C++标准程序库提供了各具特长的不同容器.现在的问题是:该如何选择最佳的容器类别?下表给出了概述. 但是其中有些描述可能不一定实际.例如:如果你需呀处理的元素数量很少,可以虎落复杂度,因为线性算法通常对元素本身的处理过程比较快,这种情况下,"显性复杂度搭配快速的元素处理"要比"对数复杂度搭配慢的元素处理"来得划算.     作为对上表的补充,使用时:     1.缺省情况下应该使用vector.vector的内部结构最简单,并允许随机存取,所以数据的存取十分方便

连载:面向对象葵花宝典:思想、技巧与实践(32) - LSP原则

LSP是唯一一个以人名命名的设计原则,而且作者还是一个"女博士"  ============================================================= LSP,Liskov substitution principle,中文翻译为"里氏替换原则".   这是面向对象原则中唯一一个以人名命名的原则,虽然Liskov在中国的知名度没有UNIX的几位巨匠(Kenneth Thompson.Dennis Ritchie).GOF四人帮

基于指针pointers和引用references的区别分析_java

指针用"*"和"->"操作符,引用用"."操作符,当然这是表面的区别.     1.引用必须代表一个对象,没有所谓的空引用.指针可以为NULL.即引用必须有初值,指针不然.所以在使用pointers之前,必须测试它是否为null.references不需要测试.     2.pointers可以被重新赋值,指向另一个对象,reference总是指向(代表)它最初获得的那个对象: 复制代码 代码如下: string s1("Nanc

Smart Pointers - What, Why, Which?

Smart Pointers - What, Why, Which? What are they? Smart pointers are objects that look and feel like pointers, but are smarter. What does this mean? To look and feel like pointers, smart pointers need to have the same interface that pointers do: they