指针
动态内存分配和管理离不开指针。
1、内存空间的访问方式
在c++中程序如何利用内存单元存取数据?有两种方式:变量名和地址。
2、指针变量的声明
指针变量永不存放内存单元地址的。
声明的语法形式:
数据类型 *标识符;
所有指针的值都是默认是unsigned long int 型。
指针可以指向各种类型,包括基本类型、数组(数组元素)、函数、对象、同样可以指向指针。
3、与地址相关的运算----"*"和"&"
“*”称为指针运算符(也称为解析),表示获取指针所指向的变量的值。
“&”称为取地址运算符,
4、指针的赋值
声明指针后必须先赋值,然后才可以引用。
赋初值有两种方法:
a、在声明指针的同时进行初始化赋值,语法形式:
存储类型 数据类型 *指针名=初始地址;
b、在声明之后,单独使用赋值语句,赋值语句的语法形式为:
指针名=地址;
关于指针的类型,还应该注意以下几点:
a、可以声明指向常量的指针,此时不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。
const char *name1="John";
char s[]="abc";
name1=s;//正确
*name1='1';//编译时指出错误
b、可以声明指针类型的常量,这时指针本身的值不能被改变。如
char * const name2="john";
name2="abc";//错误,name2是指针常量,值不能改变。
c、一般情况下,指针的值只能赋给相同类型的指针。但是有一种特殊的void类型指针,可以存储任何类型的对象地址,就是说任何类型的指针都可以赋值给void类型的指针变量。
5、指针运算
int *p;
p=0;//可以避免误用指针p
6、用指针处理数组元素
7、指针数组
如果一个数组的每个元素都是指针变量,这个数组就是指针数组。其声明形式如下:
类型名 *数组名[下标表达式]
8、指针型函数
使用指针型函数的最主要目的就是要在函数结束时把大量的数据从被调用函数返回到主调函数中。其声明形式如下:
数据类型 *函数名(参数表)
{
函数体
}
9、指向函数的指针
声明一个函数指针时,也需要说明函数的返回值和形式参数列表,其一般语法如下:
数据类型 (*函数指针名)(形参表)
函数指针在使用之前也要进行赋值,使指针指向一个已经存在的函数代码的起始地址,一般语法为:
函数指针名=函数名;
10、对象指针
a、对象指针的一般概念
对象所占据的内存空间只是用于存放数据成员的,函数成员不在每一个对象中存储副本。对象指针就是用于存放对象地址的变量。对象指针遵循一般变量指针的各种规则,一般语法形式如下:
类名 *对象指针名;
eg:
Point *p_Point;//声明Point类的对象指针变量
Point p1;//声明Point类的对象p1
p_Point=&p1;//将对象p1的地址赋给p_Point,使p_Point指向p1
访问对象成员的语法形式如下,
对象指针名->成员名
#include<iostream>
using namespace std;
class Point
{
public:
Point(int xx=0,int yy=0){X=xx;Y=yy;}//构造函数
int GetX(){return X;}//内联函数,返回X
int GetY(){return Y;}//内联函数,返回Y
private:
int X,Y;
}
int main()
{
Point A(4,5);
Point *p1;
p1=&A;
cout<<p1->GetX()<<endl;
cout<<A.GetX()<<endl;
}