你真的理解指针了吗?来道指针6级题目!
思考一下下面的程序会输出什么,以及为什么
#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