1、可以声明void类型指针,但不能声明void类型变量。
2、void类型指针可指向别的数据类型变量
3、void指针赋值其他数据类型指针需要强制类型转换
例:void *pv; int*print; print=(int *)pv;
4、指针算数运算,其加减为地址的加减。指向下一个or前一个数据。
5、指向数组元素的指针
例:int a[10],*pa;
pa=&a[0];或pa=a;
· a[i], *(pa+i), *(a+i), pa[i]是等效的。
· a是数组首地址常量。
6、指针数组
①一维数组
例:利用指针数组输出单位矩阵
#include<iostream.h>
void main()
{
int line1[]={1,0,0};
int line2[]={0,1,0};
int line3[]={0,0,1};
int *p_line[3]; //声明指针数组
p_line[0]=line1; //地址赋值
p_line[1]=line2;
p_line[3]=line3;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++) //*p_line[i]+1可以写成*p_line[i][1],看第5项。
{cout<<p_line[i][j]<<" ";}
cout<<endl;
}
}
②二维数组
例:指针数组输出二维数组
#include<iostream.h>
void main()
{
int array2[2][3]={{11,12,13},{21,22,23}};
for(int i=0;i<2;i++)
{
cout<<*(array2+i)<<endl; //会输出一段地址,*(array2+i)是行地址。
for(int j=0;j<3;j++)
cout<<*(*(array2+i)+j)<<" ";//表示数组元素值
cout<<endl;
}
}
7、指针与常量
①指向常量的指针(指向的地址可以改变,指向的对象不能通过指针改变,因为指向的是常量呀。)
不能通过指针来改变对象的值,但指针本身可以指向另外的对象。
例1:
const int n2=5;
const int *pn=&n2;
*pn=6 //错误,不能通过指针更改对象值
例2:
const char *name1="john";
char s[]="abc";
name1=s; //对,可以指向另外的对象
*name1='1' //错,不能通过指针更改对象值,john不能更改成1。
例:指向常量指针做形参。
#include<iostream.h>
const int N=6;
void print(const int *p,int n);//这里用指向常量的指针,其实用一般指针也成立。
void main()
{
int array[N];
for (int i=0;i<N;i++)
cin>>array[i]; //输入一维数组array[6]
print(array,N); //const int *p=array;指向对象array
}
void print(const int *p,int n) //以指针输出数组
{
cout<<"{"<<*p;
for(int i=1;i<n;i++)
cout<<","<<*(p+i);
cout<<"}"<<endl;
}
②指针常量(指向的地址不能改变,但是可以通过指针去改变(指向的是变量),如果指向常量就又不能改变了。)
int n1=3;
const int n2=5;
int *const pn=&n1;
pn=&n2; //错误,地址确定了不能改变了。
*pn=6; //正确,可以通过常指针改变量n1的值。
8、指向类类型对象的指针
通过指针访问对象成员
对象指针名->成员名
void main()
{
Point A(5,10);
Point *ptr;
ptr=&A;
int x;
x=ptr->GetX(); //x=A.GetX();
cout<<x<<endl;
}
9、指针和引用的区别
主要区别是引用是引用内容的别名,不可以改变;指针是指向内容所在地址,非常指针是可以改变地址指向的。
10、指向指针数组的指针:二级指针。
#include<iostream.h>
//Point类省略
void f(Point **a,int n)
void main()
{
Point *pa[2];
pa[0]=new Point(1,3);
pa[1]=new Point(2,4);
f(pa,2);
delete pa[0];
delete pa[1];
}
void f(Point **a,int n) //也可以写成void f(Point *a[],int n),指的是地址嘛
{
for(int i=0;i<n;i++)
cout<<a[i]->GetX()<<endl;
//这里调用a[i]->GetX,回顾,如果是Point *a;则(*a).GetX()或者a->GetX();
}
11、指针型函数
当函数的返回值是地址时,该函数就是指针型函数。
声明形式:存储类型 数据类型 *函数名();
指向函数的指针:声明形式:存储类型 数据类型 (*函数指针名)();