先来看下使用指针时候要用到的符号的功能:
& 是一元运算符,返回操作数的内存地址。
间接寻址运算符 *,第二个运算符是间接寻址运算符 *,它是 & 运算符的补充。* 是一元运算符,返回操作数所指定地址的变量的值。
再看一个实例,
#include <iostream>
using namespace std;
int main ()
{
int var;
int *ptr;
int val;
var = 3000;
// 获取 var 的地址
ptr = &var;
// 获取 ptr 的值
val = *ptr;
cout << "Value of var :" << var << endl;
cout << "Value of ptr :" << ptr << endl;
cout << "Value of val :" << val << endl;
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
Value of var :3000
Value of ptr :0xbff64494
Value of val :3000
这些网上的列子很多,也很好理解。下面我谈下我对指针的理解。
int* p,那么p就是一个指向int类型的指针,声明指针的时候要这样声明。就会有这样一个内存,这块儿内存里要指定一个地址,就是说这块儿内存要存一块儿地址。这块儿内存为了方便我们用代码控制,起个名字叫p,而p只是一个名字,不占用内存里的任何字节,占字节的是p代表的那块儿内存 ,就好像地球上的一个人,这个人的名字不占用地球上的任何空间,只有这个人的名字代表的这个人才占用地球上的空间。
给指针p可以这样赋值:
p=&n,
也可以这样,在声明的时候就赋值:
int* p=&n;
用打印语句打印p的值,就是&n。即n的地址。
打印*p,就是n的值。
下面是我的代码,对指针的应用:
#include <iostream>
using namespace std;
int Num2 = 0;
int Num1 = 10;
int Num3 = 40;
void Swap(int *ptr);
void SwapPlus(int **ptr);//同理,还是操作一段内存里存的值,这里的意思是操作了指针的指针(指针爸爸),我用“指针爸爸”
//来区别这行注释里的出现的第一个“指针”。那么这段函数的操作就是,把指针爸爸传进来,我要改变
//它的儿子----指针,
class Point
{
public:
void setPoint(int x, int y);
//类内部的成员函数
void printPoint()
{
cout << "x = " << xPos << endl;
cout << "y = " << yPos << endl;
}
private:
int xPos;
int yPos;
};
//类Point成员函数的实现方式有两种,在类外用作用域操作符::
void Point::setPoint(int x, int y)
{
xPos = x;
yPos = y;
}
int main()
{
int m = 5;
int n = 10;
int *p = &m;
p = &n;
printf("p之前是%p\n", p);
printf("p之前所指%d\n", *p);
//Swap(p);
SwapPlus(&p);
printf("p之后是%p\n", p);
printf("p之后所指%d\n", *p);
printf("%p\n", &(*p));
printf("%p\n", &m);
printf("%d\n",m);
//C++面向对象编程 类的实例化 方法1 new关键字 内存是在stack上 需玩家手动释放内存
//Point *A = new Point;
//A->setPoint(1, 2);
//A->printPoint();
方法2 由系统自己分配内存 在Heap上 不需要玩家手动回收内存
//Point B;
//B.setPoint(1,2);
//B.printPoint();
//cout << &(*A) << endl;//输出后打印的是00DEF3D0
//cout << A << endl;//输出后打印的是00DEF3D0
//cout << &A<< endl;//输出后打印的是00B7F840
//cout << &B << endl;//输出后打印的是00B7F830
}
void Swap(int *ptr)//我写了一个替换一个变量的函数,经过测试,c++,可以通过指针的操作直接控制一段内存里存的值,这里
//如果直接写成(int ptr),只是进行了值的传递,并没有操作内存里的值
//所以,就穿进去一个地址,地址是可以被一个指针所指的
{
*ptr = Num3;//地址传进来了,就直接改变这个地址里存的值,之前不是5吗,我让你变成30
}
void SwapPlus(int ** ptr)//同理,还是操作一段内存里存的值,这里的意思是操作了指针的指针(指针爸爸),我用“指针爸爸”
//来区别这行注释里的出现的第一个“指针”。那么这段函数的操作就是,把指针爸爸传进来,我要改变
//它的儿子----指针,
{
*ptr = &Num3;//指针爸爸传进来了,那就让指针爸爸的儿子*ptr等于Num3的地址,
}