您的位置:首页 > 其它

指针、数组,和指针算术你基本入门了(理解了这些)

2016-01-26 17:15 239 查看
下面给出一段程序源代码:

// 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。(上面的程序中已经体会出来了)

3. C++将数组名解释为第一个元素的地址。在使用sizeof运算符时例外,参见第七条。在对数组名取地址时例外,参见第八条。

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创建数组和使用指针访问不同的元素在程序中是很方便的,只有把指针当作数组名即可,当然了你首先的理解其中的原理,这样的话使用起来便游刃有余了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: