下面给出一段程序源代码:
// pointer.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include <iostream> int _tmain(int argc, _TCHAR* argv[]) { using namespace std; double wages[3] = {3.30,6.60,9.90}; short stacks[3] = { 1, 2, 3 }; double *pw = wages; cout <<"*pw= "<< *pw << endl; //打印指针存放的地址里面的值 cout <<"pw= "<< pw << endl; //打印指针里面存放的地址 cout <<"wages= "<< wages << endl; //打印第一个元素的地址 cout <<"&wages= "<< &wages<< endl; //打印整个数组的地址 cout << endl; cout <<"sizeof wages= "<< sizeof wages << endl; //打印所有数组元素占的地址空间 cout << "sizeof &wages[0]= " << sizeof &wages[0] << endl; // cout << "sizeof &wages= " << sizeof &wages << endl; // cout << "sizeof pw= " << sizeof pw<< endl; // cout << "sizeof *pw= " << sizeof *pw << endl; //打印第一个元素占用的地址空间 cout << "sizeof wages[0]= " << sizeof (wages[0]) << endl; //打印第一个元素占用的地址空间 cout << "sizeof &pw= " << sizeof &pw << endl; //打印指针变量pw本身所占用的地址空间的大小 cout << "sizeof (double)= " << sizeof (double) << endl; //double类型的字节数 cout <<endl << endl; pw = pw + 1; //指针变量加1,相当于加了一个double类型占用的字节数 cout <<"pw = pw + 1= "<<*pw << endl; //此时pw指针指向了数组的第二个元素 *pw = *pw + 1; //指针变量所存放的值加一。 cout <<"*pw = *pw + 1= "<<*pw << endl; //打印指针所指的地址里面存放的值 cout << wages[1] << endl << endl; //通过数组名加下标的形式来访问,验证了指针变量所存放的值加一 pw = pw - 1; //将pw指针从新指向数组的首地址 cout << "pw = pw - 1= " << *pw << endl; cout << wages[0] << endl; //通过数组名加下表的形式访问数组的元素 cout << *(wages + 0) << endl; //通过指针的形式来访问数组元素 cout << wages[1] << endl; cout << *(wages + 1)<<endl; cin.get(); return 0; } </span>程序运行结果:
知识点:
指针和数组基本等价,原因在于指针算术和C++内部处理数组的方式。
将整数变量加1后,其值将加1;但将指针变量加1后,增加的量等于它指向的类型的字节数。
3. C++将数组名解释为第一个元素的地址。在使用sizeof运算符时例外,参见第七条。在对数组名取地址时例外,参见第八条。
4. 程序中pw存储的是地址,而*pw存储的是该地址中的值。
例如:short test【10】;cout<<test<<endl;//显示第一个元素的地址cout<<&test<<endl;//显示整个数组的地址解析:从字面上说,这两个地址是等价的。从概念上说&test[0] 即(test)是一个2个字节内存块的地址;而&test是一个20个字节内存块的地址。所以将test+2则是将地址加2,而&test+2则是将地址加20。换句话说,test是一个short指针(*short),而&test也是一个指针,但是它指向包含了20个元素的short数组(short(*)[20])。这样或许更好理解。