先回顾下指针:
在程序中一般是通过变量名来对内存单元进行存取操作的。其实程序经过编译以后已经将变量名转换为变量的地址了,对变量值的存取都是通过地址进行的。
所以可以通过指针间接访问。
在数组指针中(指向数组的指针),如果指针变量指向数组中的一个元素,则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类型”理解为能指向“任何的类型”的数据,而应理解为“指向空类型”或“不确定的类型”的数据,记得强制类型转换。