Pointers与References(二)

16.4 赋值pointers和references.

就像你看到使用“寻址”操作符的语法一样,一个指针被赋值得到“寻 址”操作符的返回值。因为“寻址”操作符的返回值就是一个指针,所有事 情

都考虑过了,你的代码应该通过编译。对于赋值给一个指针,它必须在内存中得到一个地 址,不然编译器将给你提示错误。

int x;
int* px = &x;

上 面一段代码说明了被声明为int类型的变量x,一个被声明为指针的变量并给赋值内存中x的地 址。指针px实际上通过存储在内存中x的地址“指向”x。记住当声明一个指针时 ,需要同类型的指针在你所在地址中充当变量或常量。

现在这里你开始明白指针和references的不同了。赋值一个指针给内存中的地址,你不得 不使用“寻址”操作符来返回指针变量在内存中的地址。

而一个references,不管怎样,都不需要使用“寻址”操作符赋值成内存中的 地址。赋值一个地址给一个reference,你只需要使用变量充当rvalue值就行。int x;
int& rx=x;

上面代码显示类型int的变量x被声明,然后reference rx也被声明,并且被赋值“充当”x。注意不管x的地址是怎样存储在rx中,或者 说通过rx“被参考”,不必使用其他操作符,仅是变量。在你遇到必须声明同类 型reference作为变量或常量的情况,你也必须遵循此类方法来充当指针。

有可能,你想知道一个指针能显示什么内容,就像这样:#include <iostream.h>
int main()
{
int someNumber = 12345;
int* ptrSomeNumber = &someNumber;
cout << "someNumber=" << &someNumber <<endl;
cout << "ptrSomeNumber=" << prtSomeNumber <<endl;
return 0;
}

假如你编译并运行此代码,你应该会得到变量someNumber输出 12345,ptrSomeNumber将输出一个十六进制数(内存中地址都是以十六进制被实现的。)现在 ,如果你想输出prtSomeNumber所指的值,你应该使用这些代码:

#include <iostream.h>
int main()
{
int someNumber = 12345;
int* ptrSomeNumber = &someNumber;
cout << "someNumber=" << &someNumber <<endl;
cout << "ptrSomeNumber points to " << *prtSomeNumber <<endl;
return 0;
}

所以从原理上来说,当你想使用、修改或操作指针x所指的值 ,你就可以使用*x来充当此值或变量。

这里有一个指针和referenceds能做的事的速查列表:

你能赋值指针来“指向”内存中的地址。

你能赋值reference来“充当”变量或常量。

你能复制指针值给其他指针。

你能分别修改指针或references所指或充当的,在内存中存储的值。

你能对指针所指地址作递增或递减的操作。

你能传递指针和references给函数(更多信息见“通过reference传递”中可 找到)。

......待续。

时间: 2024-09-13 22:34:29

Pointers与References(二)的相关文章

Pointers与References(一)

译者注:本文节选自<How to Think Like A Computer Scientist,Learning with C++> 第16章,作者Allen B. Downey).此书对于国内"初级"C++爱好者来说,是一本 不可多得的入门书籍.我的这版是PALM电子书. 正文: 我认为最简单的方法解释Pointers 和 References就是举例证明了.首先让我们看一些表 达式:x=1; 在表达式中,当你使用一个变量,特别是一个字母或标记符来 存储数据.在编程过程

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

开发那点事系列二 - ClassLoader trouble shooting references

         工作中需要解决一些servlet容器类加载器的问题,尤其是Jboss 4.x系列,比方说log4j版本冲突需要靠更改配置项Java2ClassLoadingCompliance,UseJBossWebLoader:ear包部署,出现NoSuchMethodError,NoSuchFieldError,NoClassDefFoundError等(二进制兼容错误)需要进行类隔离(在 JVM加上-XX:+TraceClassLoading  -XX:+TraceClassUnload