C++指针

来源:互联网 发布:linux内核开发教程 编辑:程序博客网 时间:2024/06/06 04:55

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、指针型函数

当函数的返回值是地址时,该函数就是指针型函数。

声明形式:存储类型  数据类型  *函数名();

指向函数的指针:声明形式:存储类型  数据类型  (*函数指针名)();


0 0
原创粉丝点击