你真的理解指针了吗?来道指针6级题目!

2 篇文章 0 订阅

思考一下下面的程序会输出什么,以及为什么

#include "pch.h"
#include <iostream>

using namespace std;

bool myproc(int** var)
{
    std::cout << "传入时&var:" << &var << std::endl;
    std::cout << "var:" << var << std::endl;
    std::cout << "*var:" << *var << std::endl;
    *var = new int[3]();
    (*var)[0] = 1;
    (*var)[1] = 2;
    (*var)[2] = 3;
    std::cout << "申请后&var:" << &var << std::endl;
    std::cout << "申请后var:" << var << std::endl;
    std::cout << "申请后*var:" << *var << std::endl;
    return true;
}
bool myrelease(int** var)
{
    delete[] *var;
    return true;
}
int main()
{
    int** var1 = NULL;
    std::cout << "&var1:" << &var1 << std::endl;
    std::cout << "var1:" << var1 << std::endl;

    var1=new int*();
    std::cout << "&var1:" << &var1 << std::endl;
    std::cout << "var1:" << var1 << std::endl;
    std::cout << "*var1:" << *var1 << std::endl;

    myproc(var1);
    std::cout << "&var1:" << &var1 << std::endl;
    std::cout << "var1:" << var1 << std::endl;
    std::cout << "*var1:" << *var1 << std::endl;
    
    std::cout << "(*var1)[0]:" << (*var1)[0] <<",(*var1)[1]:"<< (*var1)[1] <<  std::endl;
    std::cout << "(*var1+0):" << (*var1 + 0) << ",(*var1+1):" << (*var1 + 1) << std::endl;
    std::cout << "(*var1)[0]:" << (*var1 + 0)[0] << ",(*var1)[1]:" << (*var1 + 1)[0] << std::endl;
    myrelease(var1);

    delete var1;
    std::cout << "&var1:" << &var1 << std::endl;
    std::cout << "var1:" << var1 << std::endl;
    var1 = NULL;
    std::cout << "var1:" << var1 << std::endl;

    return 0;
}

 

下面是问题解答:

 

 

#include "pch.h"
#include <iostream>

using namespace std;

bool myproc(int** var)    //按值传递,先复制
{
    std::cout << "传入时&var:" << &var << std::endl;  //在函数内部申请一个变量var,其所在地址为 002CFCB8
    std::cout << "var:" << var << std::endl; //var的值从实参复制过来的 即 007C4DF0
    std::cout << "*var:" << *var << std::endl;//地址号007C4DF0中目前存储的是空地址00000000
    *var = new int[3]();   //申请一个块地址,把地址号存储在*var中,我这里申请到了007CDA10,即地址号007C4DF0中存储着一个地址号007CDA10
    (*var)[0] = 1;  //在地址号007CDA10存储整型值1;
    (*var)[1] = 2;   //在地址号007CDA14存储整型值2;
    (*var)[2] = 3;   //在地址号007CDA18存储整型值3;
    std::cout << "申请后&var:" << &var << std::endl;  //var变量所在地址002CFCB8
    std::cout << "申请后var:" << var << std::endl;     //var变量中存储的地址号007C4DF0(再次强调:从实参复制过来的)
    std::cout << "申请后*var:" << *var << std::endl;   //地址号007C4DF0中存储的地址号007CDA10
    return true;
}
bool myrelease(int** var)
{
    delete[] *var;
    return true;
}
int main()
{
    int** var1 = NULL;   //var1是一个存储指针的变量,var1的值将指向一个地址,而这个地址中存储着另一个地址,那个地址存放一个int类型的值
    std::cout << "&var1:" << &var1 << std::endl;    //var1变量所在地址,我这里var1的地址为002CFDB4
    std::cout << "var1:" << var1 << std::endl;     //var1变量中存储的值:此时存储的一个空地址即00000000

    var1=new int*();       //申请一个地址,并把地址号存储在var1,我这里申请到了007C4DF0
    std::cout << "&var1:" << &var1 << std::endl;  //var1变量所在地址002CFDB4
    std::cout << "var1:" << var1 << std::endl;  //var1=new int*(); 申请到的地址号007C4DF0
    std::cout << "*var1:" << *var1 << std::endl;   //地址号007C4DF0中存储的值,如果前面new int*() 的时候清空了内存中地址号007C4DF0的内容,那么此时输出一定是00000000,即地址号007C4DF0中存储的值为0

    myproc(var1);   //传递值,就是要复制把var1中存储的值007C4DF0复制给形参
    std::cout << "&var1:" << &var1 << std::endl;  //var1的地址号002CFDB4
    std::cout << "var1:" << var1 << std::endl;   //var1中存储的地址号007C4DF0(强调:从var1=new int*();  来的)
    std::cout << "*var1:" << *var1 << std::endl; //var1中存储的指针指向的地址中存储的指针007CDA10(强调:从*var = new int[3](); 来的)
    
    std::cout << "(*var1)[0]:" << (*var1)[0] <<",(*var1)[1]:"<< (*var1)[1] <<  std::endl;
    std::cout << "(*var1+0):" << (*var1 + 0) << ",(*var1+1):" << (*var1 + 1) << std::endl;
    std::cout << "(*var1)[0]:" << (*var1 + 0)[0] << ",(*var1)[1]:" << (*var1 + 1)[0] << std::endl;
    myrelease(var1);

    delete var1;
    std::cout << "&var1:" << &var1 << std::endl;
    std::cout << "var1:" << var1 << std::endl;
    var1 = NULL;
    std::cout << "var1:" << var1 << std::endl;

    return 0;
}

 输出:

&var1:002CFDB4
var1:00000000
&var1:002CFDB4
var1:007C4DF0
*var1:00000000
传入时&var:002CFCB8
var:007C4DF0
*var:00000000
申请后&var:002CFCB8
申请后var:007C4DF0
申请后*var:007CDA10
&var1:002CFDB4
var1:007C4DF0
*var1:007CDA10
(*var1)[0]:1,(*var1)[1]:2
(*var1+0):007CDA10,(*var1+1):007CDA14
(*var1)[0]:1,(*var1)[1]:2
&var1:002CFDB4
var1:00008123
var1:00000000

画出来解释就是下面这样的:

 

看完题目和解答后,你对指针有了更清楚的认识了吗?

反正我是更加茫然了T_T 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值