指针的算术运算

    指针可以加上或减去一个整数的算术运算。

    首先来看个例子:

#include <iostream>
int main(void)
{
	using namespace std;
	double wa[3]={1000.0,200.0,3000.0};
	short st[3]={3,2,1};

	double * pw=wa;
	short * ps=&st[0];

	cout<<"pw= "<<pw<<", *pw="<<*pw<<endl;
	pw=pw+1;
	cout<<"add 1 to the pw pointer:\n";
	cout<<"pw= "<<pw<<", *pw="<<*pw<<"\n\n";
	cout<<"ps= "<<ps<<", *ps="<<*ps<<endl;
	ps=ps+1;
	cout<<"add 1 to the ps pointer:\n";
	cout<<"ps= "<<ps<<", *ps="<<*ps<<"\n\n";

	cout<<"access two elements with array notation\n";
	cout<<"st[0]="<<st[0]
		<<", st[1]="<<st[1]<<endl;
	cout<<"access two elements with pointer notation\n";
	cout<<"*st="<<*st
		<<", *(st+1)= "<<*(st+1)<<endl;

	cout<<sizeof(wa)<<"= size of wa array\n";
	cout<<sizeof(pw)<<"= size of pw pointer\n";

	return 0;
}

程序输出的结果为:

      分析上面的程序,我们可以看到,C++一般把数组名和第一个元素的地址等价,所以我们可以用上面的两种方法初始化指针,接着我们把pw加一,我们知道pw是一个指向double型的指针变量,从第二个pw的输出,得到地址值加了8个字节,于是输出的是数组第二个元素的值,接着也将ps加1,ps也指向了第二个元素,由于ps为指向short类型的指针变量,short占用2个字节,因此指针加1时,其值只增加2.接着后面的程序表明st[1]与*(st+1)都是表示数组st的第二个元素,即:C++中比较常用

arrayname[i]=*(arrayname+i);

pointername[i]=*(pointername+i);

数组名一般是常量,不能进行运算,而指针名一般是指针变量可以运算例如:pointername=pointername+1;

最后我们还可以发现,对数组引用sizeof运算得到的是数组的长度,而对指针应用sizeof得到是指针的长度,即使指针指向的是一个数组。

     再看一个例子:

#include <iostream>
using namespace std;
int main()
{
	int a[5];
	int i;
	int *p;
	for(i=0; i<5; i++)
		cin>>a[i];
	cout<<endl;
	for(i=0; i<5; i++)
		cout<<a[i]<<"  ";//使用数组名和下标访问的方式访问数组进行输出
	for(i=0; i<5; i++)
		cout<<*(a+i)<<"  ";//使用数组名和指针运算访问的方式进行输出
	for(p=a; p<(a+5); p++)
		cout<<*p<<"  ";//使用指针变量访问的方式进行输出
	return 0;
}

会发现3种方式输出的结果是一样的。

注意:指针变量加1后,其增加的值等于指向的类型占用的字节数。

总结

       指针可以和整数进行加减运算,但是跟一般的加减运算不同,指针的加减运算跟指针的类型密切相关,例如,char型指针p和整数3,p+3表示p所指地址后面第3个字符的地址,p-3就表示p所指地址前面第3个字符的地址。给大家一个更直接的例子,有整型数组int a[5],p指向数组首地址a,则a+3表示首地址后第3个整数的地址,即a[3]。

   “指针++”和“指针--”表示指针所指地址的下一个或前一个数据的地址。

    指针的算术运算一般都是在操作数组的时候进行,因为只有声明数组才可以得到连续的内存空间。如果我们对一个单独的变量地址进行加或减的算术运算,然后改变新地址的值,则可能会破坏该地址的数据,所以在对指针进行算术运算时要明确运算的结果是程序中分配可用的地址。

    指针的关系运算说的是相同类型的指针之间的关系运算。不同类型的指针之间的关系运算没有任何意义,指针和非0整数的关系运算也没有任何意义,但是指针可以和0进行关系运算,两个相同类型的指针相等,表示这两个指针指向同一个地址。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值