6.2.2 寻找地址
对计算机内存有了简单直观的印象之后,我们再来看看在幕后发生的一些事情。要想知道某个变量在内存里的存放地址,需要在变量名的前面加上一个"取地址"操作符(&):
- int myVar = 23409;
- std::cout << "The address of myVar is "
- << &myVar << "\n";
在默认的情况下,内存地址将显示为十六进制数字(如图6-7所示)。如果想把内存地址显示为比较容易看懂的十进制整数,可以把它转换为unsigned long整数类型:
- std::cout << "The address of myVar is "
- << (unsigned long) &myVar << "\n";
|
| 图6-7 内存地址是一些十六进制数字 |
(C++(www.cppentry.com)提供了一些更好的办法来把内存地址转换为无符号整数类型,本章下一节会讲解它们。就眼下来说,我们先用这种简单的地址转换语法。)
为了让大家对地址有进一步的了解,我们来编写一个简单的示例程序,它将创建几个变量,再找出它们的内存地址。
寻找地址
1.在文本编辑器或IDE里创建一个空白的新文本文档(代码清单6-2)。
-
- #include <iostream>
代码清单6-2 这个程序将创建5个变量,然后输出它们的地址
- 1
- 2
- 3 #include <iostream>
- 4
- 5 int main() {
- 6
- 7
- 8 int a = -12;
- 9 float b = 78.53;
- 10 char c = 'D';
- 11 unsigned long d = 1904856026;
- 12 int e = 9002356;
- 13
- 14
- 15 std::cout << "The address of a is "
- 16 << (unsigned long) &a << "\n";
- 17 std::cout << "The address of b is "
- 18 << (unsigned long) &b << "\n";
- 19 std::cout << "The address of c is "
- 20 << (unsigned long) &c << "\n";
- 21 std::cout << "The address of d is "
- 22 << (unsigned long) &d << "\n";
- 23 std::cout << "The address of e is "
- 24 << (unsigned long) &e << "\n";
- 25
- 26 std::cout << "Press Enter or Return to continue.\n";
- 27 std::cin.get();
- 28
- 29 return 0;
- 30
- 31 }
2.开始定义main()函数并创建一些变量。
- int main() {
- int a = -12;
- float b = 78.53;
- char c = 'D';
- unsigned long d = 1904856026;
- int e = 90023;
为了有所对比,我们将使用图6-6中的变量。我们还使用了不同的类型以了解这对寻址操作的影响。
3.输出各个变量的地址。
- std::cout << "The address of a is "
- << (unsigned long) &a << "\n";
- std::cout << "The address of b is "
- << (unsigned long) &b << "\n";
- std::cout << "The address of c is "
- << (unsigned long) &c << "\n";
- std::cout << "The address of d is "
- << (unsigned long) &d << "\n";
- std::cout << "The address of e is "
- << (unsigned long) &e << "\n";
利用在本节正文里描述的语法,先把这些地址转换为一个unsigned long整数,再输出它们。
4.完成main()函数。
- std::cout << "Press Enter or Return to continue.\n";
- std::cin.get();
- return 0;
5.把这个文件保存为address.cpp,然后编译并运行这个程序(如图6-8所示)。
6.如果有可能,在另一台计算机上编译并运行这个程序(如图6-9所示)。
|
图6-8 在一台Mac OS X系统上运行这个程 序将显示每个变量的地址(十进制整数) |
|
图6-9 不同的计算机会给变量分配不同的地址。 图中是在一台Windows系统上运行这个程序的结果。 注意,图中的地址是按降序(从高往低)分配的 |
"提示
虽然可以把一个地址转换为一个整数,但不应该把它保存在另一个整数变量里。如果想把一个地址存入一个变量,就应该使用指针--马上就要讲到。
变量的地址在程序执行期间是不会发生变化的。这是一项很自然的要求,不这样就没办法使用变量了。不过,同一个程序里的同一个变量在这个程序前、后两次运行时的地址往往会发生变化。
函数也保存在内存里,这意味着我们可以查出某给定函数在内存中的地址。这需要用到&functionName语法(functionName是函数的名字)。
【责任编辑:
云霞 TEL:(010)68476606】