6.2.5 指针和数组(2)
2.开始定义main()函数并创建一些变量。
- int main() {
- const unsigned short ITEMS = 3;
- int intArray[ITEMS] = {98, -486, 301589};
- char charArray[ITEMS] = {'A', 'B', 'C'};
- double doubleArray[ITEMS] = {3.14315614, 2.74546944, 7.349e14};
我们创建了3个不同类型的数组,每个数组包含3个元素,数组元素的个数由常量ITEMS决定。
3.创建必要的指针。
- int *intPtr = intArray;
- char *charPtr = charArray;
- double *doublePtr = doubleArray;
指针的类型必须与相应的数组的类型一致。我们使用各数组的名字(是intArray,不是&intArray)对它们进行了初始化。这意味着各个指针将分别保存各个数组的基地址,而不是各数组的内容。
4.利用指针输出关于第一个数组的信息,这里使用了一个循环。
- std::cout << "Array of integers:\n";
- for (int i = 0; i < ITEMS; ++i) {
- std::cout << *intPtr << " at "
- << reinterpret_cast<unsigned long>(intPtr) << "\n";
- intPtr++;
- }
我们对每个数组都采用了一个for循环来访问;具体做法已经在本章前面的内容里讲解过。在各循环语句里,信息输出工作是利用指针和指针运算完成的,没有用到任何一个数组的名字和下标。
因为intPtr指针的初始值是intArray数组的基地址,所以*intPtr的初始值就是保存在这个基地址处的值,也就是intArray数组中的第一个元素的值。那些地址在被转换为一个unsigned long整数之后也被发送到了输出。循环体中的最后一条语句对指针进行了递增,让它指向数组中的下一个元素。
5.重复步骤4,对另外两个数组进行同样的处理。
- std::cout << "\nArray of chars:\n";
- for (int i = 0; i < ITEMS; ++i) {
- std::cout << *charPtr << " at "
- << reinterpret_cast<unsigned long>(charPtr) << "\n";
- charPtr++;
- }
- std::cout << "\nArray of doubles:\n";
- for (int i = 0; i < ITEMS; ++i) {
- std::cout << *doublePtr << " at "
- << reinterpret_cast<unsigned long>(doublePtr) << "\n";
- doublePtr++;
- }
这些循环语句的代码大同小异,只是其中用到的指针的名字各有不同。虽然我们在这3条循环语句里对3个不同的指针进行了同样的递增操作(都是加1),但从这个程序的运行结果可以看出:3个指针是以不同的字节个数为步长(分别对应各有关数组的数据类型)而递增的。
6.完成main()函数。
- std::cout << "Press Enter or Return to continue.\n";
- std::cin.get();
- return 0;
- }
7.把这个文件保存为arrays2.cpp,然后编译并运行这个程序(如图6-16所示)。
"提示
指针运算的重要性在高级和抽象的程序设计工作中体现得更加明显。如果你现在还体会不到其中的奥妙,也没有关系。就目前而言,只要记住数组的名字同时也是一个指向其第一个元素的指针就行了。
数组可以是任何一种数据类型,这意味着我们完全可以创建一个以指针为元素的数组--如果有必要的话。在第14章里我们会看到一个例子:用一个指针数组把命令行参数传递到程序。
指针运算并不仅限于递增,完全可以像下面这样做:
- int *ptr1 = myArray;
- ptr1 += 2;
执行以上语句之后,ptr1指针将保存myArray数组中的第3个元素的地址。
【责任编辑:
云霞 TEL:(010)68476606】