6.2.5 指针和数组(1)
在此前关于地址和指针的例子里,我们使用的都是标量类型:整数、实数和字符。在遇到一个标量类型的变量时,我们可以创建一个与之类型相同的指针来存放它的地址。可是,在遇到数组时该怎么办呢?
在幕后,计算机将把数组保存在一组连续的内存块里,而不是像对待其他变量那样把它保存在一个内存块里。比如,以下代码所定义的数组可能会像如图6-15所示保存在内存里:
- int myArray [] = {25, 209, -12};
这意味着数组有多个地址,每个地址均对应着数组中的一个元素。你也许会因此而认为访问数组的地址是一件很困难的事情,但事实刚好相反。在C++(www.cppentry.com)(以及C语言)里,数组的名字同时也是一个指向其基地址(其第一个元素的地址)的指针。以myArray数组为例,这意味着下面两条语句可以完成同样的事情:
- int *ptr1 = &myArray[0];
- int *ptr2 = myArray;
这两条语句都可以在指针里存放基地址,即数组中第一个元素的地址(见图6-15)。使用解引用操作符(*),可以马上访问数组中的第一个元素:
- std::cout << *ptr1;
- *ptr2 = 98744;
如果想使用一个指针访问一个数组元素,问题将变成:怎样才能访问其他的数组元素?解决方案是通过指针运算来改变在指针里保存的地址。
请看*ptr1(或*ptr2),它现在保存数
- ptr1++;
对一个指向某个数组的指针进行递增的结果是该指针将指向下一个元素的地址。现在,如果再次使用*ptr1指针,将得到保存在第二个元素里的值。
指针运算的奇妙之处在于,地址值并不是按1递增的,它将按照那种数组类型在那台计算机上所需要的字节个数来递增。比如,如果有一个包含3个整数的数组、每个整数需要4字节来存储(如图6-15所示),对一个指向该数组的指针进行递增(加1)将使地址以4字节为单位进行递增!如果是一个指向某个字符数组的指针(字符数组的每个元素只占用1字节),地址将以1字节为单位进行递增。接下来的示例程序将证明这一点。
使用数组指针
1.在文本编辑器或IDE里创建一个空白的新文本文档(代码清单6-5)。
-
- #include <iostream>
代码清单6-5 这个程序演示了与指针和数组有关的许多概念,重点是如何通过指针访问数组中的每一个元素,以及指针运算不需要考虑具体的数据类型
- 1
- 2
- 3 #include <iostream>
- 4
- 5 int main() {
- 6
- 7
- 8 const unsigned short ITEMS = 3;
- 9
- 10
- 11 int intArray[ITEMS] = {98, -486, 301589};
- 12 char charArray[ITEMS] = {'A', 'B', 'C'};
- 13 double doubleArray[ITEMS] = {3.14315614, 2.74546944, 7.349e14};
- 14
- 15
- 16 int *intPtr = intArray;
- 17 char *charPtr = charArray;
- 18 double *doublePtr = doubleArray;
- 19
- 20
- 21 std::cout << "Array of integers:\n";
- 22
- 23
- 24
- 25 for (int i = 0; i < ITEMS; ++i) {
- 26 std::cout << *intPtr << " at "
- 27 << reinterpret_cast<unsigned long>(intPtr) << "\n";
- 28 intPtr++;
- 29 }
- 30
- 31
- 32 std::cout << "\nArray of chars:\n";
- 33 for (int i = 0; i < ITEMS; ++i) {
- 34 std::cout << *charPtr << " at "
- 35 << reinterpret_cast<unsigned long>(charPtr) << "\n";
- 36 charPtr++;
- 37 }
- 38
- 39
- 40 std::cout << "\nArray of doubles:\n";
- 41 for (int i = 0; i < ITEMS; ++i) {
- 42 std::cout << *doublePtr << " at "
- 43 << reinterpret_cast<unsigned long>(doublePtr) << "\n";
- 44 doublePtr++;
- 45 }
- 46
- 47 std::cout << "Press Enter or Return to continue.\n";
- 48 std::cin.get();
- 49 return 0;
- 50
- 51 }
【责任编辑:
云霞 TEL:(010)68476606】