6.2.4 利用指针改变值(1)
下面是对目前为止已经介绍的关于内存、地址和指针知识的总结:
创建变量时,系统将分配一些内存块来保存它们的值;
每个内存块都有个独一无二的地址;
变量的地址可以利用&variablename语法(&是"取地址"操作符)来检索;
可以把地址赋值给一种称为指针的特殊的变量;
指针的类型必须与由它保存其地址的变量的类型相一致。
接下来你将看到一些真正的好东西。请看下面这段代码:
- int a = 456;
- char b = 'Q';
- int *aPointer = &a;
- char *bPointer = &b;
这会让程序保留4个内存块,两个为变量保留,两个为指针保留。在为变量保留的内存块里,存放着变量的值;在为指针保留的内存块里,存放着指针的值,这些值是其他变量的地址(如图6-12所示)。
知道了某个变量在内存中的地址(通过指针),就可以利用指针访问位于该地址的数据。这需要对指针做解引用(deference)处理--在指针名的前面加上一个星号(*):
- std::cout << *aPointer;
看明白了吗?把整数变量a的地址存储在aPointer指针里之后,*aPointer和变量a将代表同一个值。进一步说,把一个值赋值给*aPointer和把这个值赋值给变量a的效果完全一样(如图6-13所示):
- *aPointer = 123;
|
图6-12 指针也要占用内存, 但存放在指针里的是其他内存块的地址 (顺便说一句, 字符Q在内存里将被存储为该字 符的ASCII值, 而不是这个字母本身) |
|
图6-13 指针可以用来改变存 储在内存块里的值。这么做不会改变 指针的值,因为指针的值 是内存块的地址 |
利用指针来改变值
1.在文本编辑器或IDE里创建一个空白的新文本文档(代码清单6-4)。
-
- #include
代码清单6-4 为了演示如何通过指针去访问计算机内存里的值,这个程序先创建了一些变量,然后利用指针改变了它们的值
- 1
- 2
- 3 #include
- 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 std::string e = "arglebargle";
- 13
- 14
- 15 std::cout << "The value of a is initially "
- 16 << a << "\n";
- 17 std::cout << "The value of b is initially "
- 18 << b << "\n";
- 19 std::cout << "The value of c is initially "
- 20 << c << "\n";
- 21 std::cout << "The value of d is initially "
- 22 << d << "\n";
- 23 std::cout << "The value of e is initially "
- 24 << e << "\n";
- 25
- 26
- 27 int *aPointer = &a;
- 28 float *bPointer = &b;
- 29 char *cPointer = &c;
- 30 unsigned long *dPointer = &d;
- 31 std::string *ePointer = &e;
- 32
- 33
- 34 *aPointer = 5462;
- 35 *bPointer = -3.143022489;
- 36 *cPointer = 'Z';
- 37 *dPointer = 1604326026;
- 38 *ePointer = "foofarah";
- 39
- 40
- 41 std::cout << "The value of a is now "
- 42 << a << "\n";
- 43 std::cout << "The value of b is now "
- 44 << b << "\n";
- 45 std::cout << "The value of c is now "
- 46 << c << "\n";
- 47 std::cout << "The value of d is now "
- 48 << d << "\n";
- 49 std::cout << "The value of e is now "
- 50 << e << "\n";
- 51
- 52 std::cout << "Press Enter or Return to continue.\n";
- 53 std::cin.get();
- 54
- 55 return 0;
- 56
- 57 }
【责任编辑:
云霞 TEL:(010)68476606】