c++指针的理解及使用

  先来看下使用指针时候要用到的符号的功能:
  & 是一元运算符,返回操作数的内存地址。
  间接寻址运算符 *,第二个运算符是间接寻址运算符 *,它是 & 运算符的补充。* 是一元运算符,返回操作数所指定地址的变量的值。
  再看一个实例,
#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的地址,
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值