下面给出一段程序源代码:
// 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后,增加的量等于它指向的类型的字节数。
举个例:将指向double的指针加1后,如果你的系统对double使用8个字节存储,则数值将增加8;将指向short的指针加1后,如果你的系统对short使用2个字节存储,则指针将增加2。(上面的程序中已经体会出来了)
例外,参见第七条。在对数组名取地址时例外,参见第八条。
4. 程序中pw存储的是地址,而*pw存储的是该地址中的值。
5. *(wages + 1 ) 和wages[1]是等价的,这种表达形式可以类推。
6. 数组和指针的区别:可以修改指针的值,而数组名是常量。
7. 数组和指针的区别:对数组应用sizeof 运算符,得到的是数组的长度;而对指针使用sizeof 运算符,得到的是指针的长度,即使指针指向一个数组也是如此。(程序中有体现出来)
8. 对数组去地址时,数组名则不会解释为其地址,而是得到的整个数组的地址。
例如:
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])。这样或许更好理解。
9. 使用new创建数组和使用指针访问不同的元素在程序中是很方便的,只有把指针当作数组名即可,当然了你首先的理解其中的原理,这样的话使用起来便游刃有余了。