大家好,在下康宁。 本文探讨了C++指针、数组和指针算术间的一些关系。 话不多说,上代码(注意看注释)。
C++中数组名和指针基本等价
代码1:
#include<iostream>
int main()
{
using namespace std;
double wages[3] = {1.0,2.0,3.0};
short stacks[3] = {1,2,3};
double * pw = wages; //注意,数组名可以赋给指针
short * ps = new int; //而指针不可以赋给数组名
stacks=ps; //error,数组名为常量,值不可变
stacks++; //error,数组名为常量,值不可变
ps++; //ok,指针为变量,值可变
}
C++将数组名解释为地址,而数组名被视为数组的首地址,因而可以将数组名赋值给存储地址的指针。反过来,无法对数组名进行赋值运算或加减运算,这是因为数组名是常量。
指针算术
代码2:
#include<iostream>
int main()
{
int * a = new int ;
double * b = new double ;
cout<<"a= "<<a<<endl; //输出a的地址,a=0x28cc00
cout<<"b= "<<b<<endl; //输出b的地址,b=0x28aa00
a++;b++;
cout<<"a= "<<a<<endl; //a=0x28cc04,多了4(int的长度)
cout<<"b= "<<b<<endl; //b=0x28aa08,多了8(double的长度)
}
指针值增加1,其存储的地址值将增加1指针类型的长度,如int型指针将加4,double型将加8。 还存在同类型指针间的减法,若p1指向int型a[1],p2指向a[2],则p2-p1返回两指针间的长度差,p2-p1=1。
C++内部处理数组的方式
代码3:
int main()
{
int a[10]={0,1};
int * pa=a; //此时指针 pa 中存储的是数组 a 的首地址值。
cout<<"*pa= "<<*pa<<endl; //*pa=0
cout<<",a[0] = "<<a[0] <<endl; //a[0]=0
cout<<"*(pa+1)= "<<*(pa+1)<<endl; //*(pa+1)=1
cout<<"a[1] = "<<a[1]<<endl; //a[1]=1
}
在此例中,指针pa刚开始时存储数组a的首地址值(a[0]的地址),当指针pa+1后,它存储的值变为数组a首地址+sizeof(int),正好是数组a第二个值(a[1])的存储地址。 事实上,a[0]=*(a+0),a[1]=*(a+1)。
|