1.指针定义
指针变量存储变量内存中的起始地址,相当于Java中的引用。由于仅仅存储了内存的起始地址,所以要正确的存取指向数据,还必须知道数据所占用的字节数,所以声明指针时还必须声明类型。
指针的声明方式为:
类型 *变量名;
比如: int *p; float *p1;
1.1 为指针赋值
为指针型变量赋值使用运算符&(获取变量在内存中的地址),如下式:
int a=5,*pointer;
pointer = &a;
当然两个指针型变量可以相互赋值:
int *pointer2=NULL;
pointer2 = pointer;
void main()
{
int y=15, *ip;
ip = &y; <span style="white-space:pre"> </span>//其中ip是int型的指针类型,存放了指向数据(y)的首地址
cout << "ip=" << ip << " &y=" << &y << " *ip=" << *ip;
cout << "\n";
*ip = 10;<span style="white-space:pre"> </span>//*p是指针声明的指向数据类型即int型,所以可以直接赋值
cout << "&y=" << &y << " y=" << y << " *ip=" << *ip;
}
打印结果:
ip=00A2FC40 &y=00A2FC40 *ip=15
&y=00A2FC40 y=10 *ip=10
在C++中结构体和类变量的赋值操作对应的是对象间的浅拷贝,这一点和JAVA不同(JAVA中赋值就是引用地址的变化),如果使用指针可以做到和JAVA一样的赋值效果
struct student{
char name[20];
char id[10];
int age;
float score;
};
void main()
{
student st1, st2, *prst, *prst2;
st1.age = 10;
st2 = st1;//对象间的浅拷贝
st2.age = 12;
prst = &st1;
prst2 = &st2;
cout << "prst=" << prst << " prst2=" << prst2;//地址不同
cout << " st1.age=" << st1.age << " st2.age=" << st2.age << "\n";//值也不同
prst->age = 12;
cout << "st1.age=" << st1.age << " prst.age=" << prst->age << "\n";//值相同
}
输出结果:
prst=0091FD88 prst2=0091FD58 st1.age=10 st2.age=12
st1.age=12 prst.age=12
1.2 函数指针
在C++中指针同样可以指向函数。函数指针最大的作用是把一个函数作为参数传递给另一个函数。如下例所示:
#include <iostream>
using namespace std;
int add(int a, int b){
return a + b;
}
int subtraction(int a,int b){
return a - b;
}
/*
*形参为函数指针类型
*/
int operation(int x, int y, int(*mfun)(int, int)){
return (*mfun)(x,y);//调用函数mfun
}
void main(){
//声明函数指针minus指向subtraction
int(*minus)(int, int) = subtraction;
int m, n;
m = operation(4, 5, add);
n = operation(20, m, minus);
cout << n;
}
输出结果为:
11