C++指针

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

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

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值