关于使用指针的发散

先回顾下指针:

在程序中一般是通过变量名来对内存单元进行存取操作的。其实程序经过编译以后已经将变量名转换为变量的地址了,对变量值的存取都是通过地址进行的

所以可以通过指针间接访问。

在数组指针中(指向数组的指针),如果指针变量指向数组中的一个元素,则p+1指向同一数组的下一个元素。

a[i]==*(a+i)==*(p+i)

使用a[i]和*(a+i)的执行效率是一样的,C++编译系统就是讲啊a[i]转换为*(a+i)来处理的,对每个a[i]都分别计算地址a+i*d然后访问该元素。

贴代码:

#include<iostream>
using namespace std;
int main()
{
	int i,a[10],*p=a;
	for(i=0;i<10;i++)
	cin>>*(p+i);
	for(;p<a+10;p++)
	cout<<*p;
	return 0;
}

像p++这样的自加操作是比较快的,不必每次都重新计算地址,这种方法能提高执行效率。

而且如果把第八行改成大于10,编译器不会报错,但是很显然是越界了。

再贴代码:

char *p="abcdefg";
cout<<p;


char *p="abcdefg";
cout<<(p+1);

char *p="abcdefg";
cout<<*(p+1);
这三个代码也很简单,结果很能说明问题。

贴代码:

#include<iostream>
using namespace std;
int main(int argc,char**argv)
{
	int a[5]={2,4,6,8,0};int *p,*q;
	p=&a[2];
	q=&a[4];
	cout<<*p<<' '<<*q<<endl;
	cout<<(p-q);
	return 0;
} 

#include<iostream>
using namespace std;
int main(int argc,char**argv)
{
	int a[5]={2,4,6,8,0};int *p,*q;
	*p=a[2];
	*q=a[4];
	cout<<*p<<' '<<*q<<endl;
	cout<<(p-q);
	return 0;
} 
乍一看这两个代码都是一样的,但是 第二个代码很危险!!!!!!

野指针!!!一定要记得初始化。

关于void型指针

注意:“不能把指向void类型”理解为能指向“任何的类型”的数据,而应理解为“指向空类型”或“不确定的类型”的数据,记得强制类型转换。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值