指针与指针变量:
一、指针:
定义:《数据类型》 &《指针名》;
作用(及局限性):储存单个变量的地址,或储存数组单个下标内容的地址,可以做函数的形参(如:void swap(int &x,int &y)或int swap(int &x,int &y))
禁忌:不能割裂赋值,不能直接获得数组地址(仅能获得数组下标内容地址)
二、指针变量:
定义:《数据类型》 *《指针变量名》;
作用:
(1)指针变量可以定义动态数组:
格式:
1、定义一个动态数组大小控制变量(必需为整型),如:int n;
2、定义一个指向基本数据类型(int、double、char)的指针变量,如:double(int、char) *p;
3、创建指针变量的实例,如:p=new double(int、char)[n];
4、使用循环按下标输入动态数组:
for(i=0;i<n;i++) while(i!=n)
{ {
cin>>p[i]; 或 cin>>p[i];
i++;
} }
5、若要输出,也是使用循环按下标输出动态数组:
for(i=0;i<n;i++) while(i!=n)
{ {
cout<<p[i]<<"\t"; 或 cout<<p[i]<<"\t";
i++;
} }
(2)可以做指向二维数组的指针变量:
格式:
1、【直接地址法:指针变量指向数组首地址,《循环控制变量》<行*列,依次递增】:
(a)数值型:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int *P;
cout<<"指向二维整型数组的指针变量[直接地址法:指针变量指向数组首地址,《循环控制变量》<行*列,依次递增]:"<<endl;
for(P=&a[0][0];P<&a[0][0]+12;P++)
{
cout<<*P<<"\t";
}
cout<<endl;
2、【间接地址法:指针变量指向数组首元素内容,先行后列,依次递增】:
(a)数值型:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int *P;
cout<<"指向二维整型数组的指针变量[间接地址法:指针变量指向数组首元素内容,先行后列,依次递增]:"<<endl;
for(P=*a;P<*(a+2)+4;P++)
{
cout<<*P<<"\t";
}
cout<<endl;
(b)字符型:
char b[3][4]={{"ABC"},{"EFG"},{"IJK"}};
char *P_S;
cout<<"指向二维字符型数组的指针变量[间接地址法:指针变量指向数组首元素内容,先行后列,依次递增]:"<<endl;
for(P_S=*b;P_S<*(b+2)+3;P_S++)
{
cout<<*P_S<<"\t";
}
cout<<endl;
作用:快速历遍数组
禁忌:指向字符型二维数组的指针变量,不可以使用直接地址法输出
(3)指针变量可以作函数的形参,如:char *QKG(char *s)或char QKG(char *s)
(4)指针变量可以做函数类型,如:char *QKG(char *s)或char *QKG(char s)
(5)指针变量可以使用->(结构指向运算符)和.(域运算符)指向结构体类型,如:
struct Data
{
int year;
int month;
int day;
};
Data d={2017,2,6},*p=&d;//获得整个结构体块地址
cout<<(*p).year<<"-"<<(*p).month<<"-"<<(*p).day<<endl;//指向结构体类型中子类型地址
cout<<p->year<<"-"<<p->month<<"-"<<p->day<<endl;//指向结构体类型中子类型地址
(6)指针变量可以指向函数,如:double (*F)(double);//格式:《需指向的函数数据类型》 (*p)(需指向的函数形参的数据类型)
//禁忌:指针变量指向的函数类型不能是无返回值的函数,也不能指向有多个形参的函数
(7)指针变量可以指向含有M个数值的一维数组指针变量,如:
1、定义3行4列的二维数组,及指向4个数值的一维数组指针变量*p:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},(*p)[4];
2、【地址位移法,指针变量获得二维数组首地址,先行后列,历遍输出】:
for(p=a;p<a+3;p++)
{
for(int j=0;j<4;j++)
{
cout<<*(*p+j)<<"\t";
}
cout<<endl;
}
3、【双重指针变量法,定义另一个指针变量指向指向含有M个数值的一维数组指针变量,先行后列,历遍输出】:
for(p=a;p<a+3;p++)
{
for(int *q=*p;q<*p+4;q++)
{
cout<<*q<<"\t";
}
cout<<endl;
}
作用:快速历遍数组
禁忌:指针变量指向单个变量必需使用取地址运算符&,指针可以指向任意类型的数组,但是如果想用指针变量导出数组则必需要使用取内容运算符*
一、指针:
定义:《数据类型》 &《指针名》;
作用(及局限性):储存单个变量的地址,或储存数组单个下标内容的地址,可以做函数的形参(如:void swap(int &x,int &y)或int swap(int &x,int &y))
禁忌:不能割裂赋值,不能直接获得数组地址(仅能获得数组下标内容地址)
二、指针变量:
定义:《数据类型》 *《指针变量名》;
作用:
(1)指针变量可以定义动态数组:
格式:
1、定义一个动态数组大小控制变量(必需为整型),如:int n;
2、定义一个指向基本数据类型(int、double、char)的指针变量,如:double(int、char) *p;
3、创建指针变量的实例,如:p=new double(int、char)[n];
4、使用循环按下标输入动态数组:
for(i=0;i<n;i++) while(i!=n)
{ {
cin>>p[i]; 或 cin>>p[i];
i++;
} }
5、若要输出,也是使用循环按下标输出动态数组:
for(i=0;i<n;i++) while(i!=n)
{ {
cout<<p[i]<<"\t"; 或 cout<<p[i]<<"\t";
i++;
} }
(2)可以做指向二维数组的指针变量:
格式:
1、【直接地址法:指针变量指向数组首地址,《循环控制变量》<行*列,依次递增】:
(a)数值型:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int *P;
cout<<"指向二维整型数组的指针变量[直接地址法:指针变量指向数组首地址,《循环控制变量》<行*列,依次递增]:"<<endl;
for(P=&a[0][0];P<&a[0][0]+12;P++)
{
cout<<*P<<"\t";
}
cout<<endl;
2、【间接地址法:指针变量指向数组首元素内容,先行后列,依次递增】:
(a)数值型:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int *P;
cout<<"指向二维整型数组的指针变量[间接地址法:指针变量指向数组首元素内容,先行后列,依次递增]:"<<endl;
for(P=*a;P<*(a+2)+4;P++)
{
cout<<*P<<"\t";
}
cout<<endl;
(b)字符型:
char b[3][4]={{"ABC"},{"EFG"},{"IJK"}};
char *P_S;
cout<<"指向二维字符型数组的指针变量[间接地址法:指针变量指向数组首元素内容,先行后列,依次递增]:"<<endl;
for(P_S=*b;P_S<*(b+2)+3;P_S++)
{
cout<<*P_S<<"\t";
}
cout<<endl;
作用:快速历遍数组
禁忌:指向字符型二维数组的指针变量,不可以使用直接地址法输出
(3)指针变量可以作函数的形参,如:char *QKG(char *s)或char QKG(char *s)
(4)指针变量可以做函数类型,如:char *QKG(char *s)或char *QKG(char s)
(5)指针变量可以使用->(结构指向运算符)和.(域运算符)指向结构体类型,如:
struct Data
{
int year;
int month;
int day;
};
Data d={2017,2,6},*p=&d;//获得整个结构体块地址
cout<<(*p).year<<"-"<<(*p).month<<"-"<<(*p).day<<endl;//指向结构体类型中子类型地址
cout<<p->year<<"-"<<p->month<<"-"<<p->day<<endl;//指向结构体类型中子类型地址
(6)指针变量可以指向函数,如:double (*F)(double);//格式:《需指向的函数数据类型》 (*p)(需指向的函数形参的数据类型)
//禁忌:指针变量指向的函数类型不能是无返回值的函数,也不能指向有多个形参的函数
(7)指针变量可以指向含有M个数值的一维数组指针变量,如:
1、定义3行4列的二维数组,及指向4个数值的一维数组指针变量*p:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},(*p)[4];
2、【地址位移法,指针变量获得二维数组首地址,先行后列,历遍输出】:
for(p=a;p<a+3;p++)
{
for(int j=0;j<4;j++)
{
cout<<*(*p+j)<<"\t";
}
cout<<endl;
}
3、【双重指针变量法,定义另一个指针变量指向指向含有M个数值的一维数组指针变量,先行后列,历遍输出】:
for(p=a;p<a+3;p++)
{
for(int *q=*p;q<*p+4;q++)
{
cout<<*q<<"\t";
}
cout<<endl;
}
作用:快速历遍数组
禁忌:指针变量指向单个变量必需使用取地址运算符&,指针可以指向任意类型的数组,但是如果想用指针变量导出数组则必需要使用取内容运算符*