一维数组的指针
如:int a[10],*p=a;
a为数组名,数组名代表数组的首地址,即&a[0]
指针类型的算术和关系运算
指针的算术运算
如:int a [10]={10,20,30},*p=a,i;
cout<<*p; 结果:10
p++;
cout<<*p; 结果:20
p指向int型,因int型变量为4字节长度,所以,p+1相当于p+4,同样p+i相当于p+i*4
两个同类型指针作减法运算
指针2-指针1==>整数(常用于计算两个指针之间包含元素的个数)
#include<iostream>
using namespace std;
int main()
{
int a[10]={10,20,30},*p1=a,*p2=a+2,i;
cout<<p2-p1<<endl;
}
结果为2
指针的关系运算
即两个指针可以比较大小
例:使用指针输出数组各元素的值
double x[5]={1,2,3,4,5,6,7},*p;
for(p=x;p<x+7;p++)
cout<<*p<<endl;
数组元素的不同表示形式
int a[10],*ptr=a,i;
a[i]=*(a+i)=*(ptr+i)=ptr[i]
a[i]为数组元素的下标法
*(a+i)为数组元素的指针法
二维数组的指针
例:寻找a数组中元素的最大值
二维数组:int a[3][4],i,j;
int *p,max=a[0][0];
for(p=&a[0][0];p<&a[0][0]+12;p++)
if(*p>max)
max=*p;
cout<<max;
注:&a[0][0]+12,是从00,01,02,03,10,11,12,13,20,以此类推
二维数组的指针法表示
如:a[3][4]
a代表&a[0],即0行的地址
a+1代表&a[1],即1行的地址
a+2代表&a[2],即2行的地址
a[i]+j代表&a[i][j]
*(a[i]+j)等价于a[i][j]
* (* (a+i)+j)为二维数组元素a[i][j]的指针法表示
a为首行地址,a+i为i行的行地址,而*(a+i)为a的i行0列元素的地址,而*(a+i)+j为a的i行j列元素的地址
注:当p表示&a[0][0]时
int a[3][4],*p=&a[0][0]
a[i][j]=*(p+i*4+j)
指向具有M个元素的一维数组指针
类型 (*指针变量)[M] (M表示二维数组的列数)
例:利用行指针变量,按行输出二维数组各元素的值
int a[3][4]={{1,3,5,7},{2,4,6,8},{1,2,3,4}},(*p)[4]; //直接声明(*p)[4]
for(p=a;p<a+3;p++)
{
for(int j=0;j<4;j++)
cout<<*(*p+j);
*p是一个行地址,*p+j代表该行j列元素的地址**
字符串指针
char *str=“hello”;
str[2] 指的是字符l
*(str+1)指的是字符e
与二维数组不同
在字符串中查找某字符的函数
结果为b=5
#include<iostream>
using namespace std;
char *str(char *c,char b) //返回值为指针的函数,调用函数定义变量也得是指针
{
while(*c!='\0') //字符串结尾为'\0',不能写' '
{
if(*c==b)
return c;
c++;
}
return NULL; //NULL必须全是大写
}
int main()
{
char *y="qwervbn",*p; //char *y,*p;不能是char *y,p;
p=str(y,'b'); //因为返回的是地址,所以p和str都是指针型 ,查找的b为字符,所以为 ‘b’
cout<<p-y<<endl; //p是b在字符串中的地址,y是首地址。
return 0;
}
指针数组
定义5个int型的指针数组
int *p[5]
定义指向多个字符串的指针数组
char *str[]={"basic","fortran","c++","java"};
结构体与指针
结构体类型 *指针变量名
访问结构变量中的成员
格式1: (*指针变量).成员名
格式2: 指针变量->成员名(->为结构指向运算符)
例子:
struct Date
{
int year;
int month;
int day;
};
int main
{
Date d={2015,4,8},*p=d;
cout<<(*p).year;
cout<<p->year;
return 0;
}
对于结构体数组
struct button top[10],*p=top;
cin>>p->name; ->前为地址
cin>>p[0].name; .前为确定的元素*p等同于*(p+a)和p[a]
动态数组
new运算符—用于动态申请所需的内存空间
指针变量=new 类型
动态申请单个变量:
动态申请一个double型变量,初值为100.0
double *p;
p=new double;
*p=100.0
或 p=new double(100.0)
动态申请数组
指针变量=new 类型[元素个数]
动态申请80个字符的数组
char *str;
str=new char[80]
动态创建n个元素的一维整形数组
#include<iostream>
using namespace std;
int main()
{
int n,*p;
cout<<"请输入n值: ";
cin>>n;
p=new int[n];
if(p=NULL)
{cout<<"没有足够的内存空间";
return 1;}
cout<<"请输入n个数:";
for(int i=0;i<n;i++)
cin>>p[i];
}
delete运算符:释放动态申请到的存储空间
动态释放单个变量:
delete 指针变量;
动态释放数组:
delete[ ]指针变量;