当前位置: 首页 > news >正文

淘宝刷单网站怎么建设源代码郑州seo优化公司

淘宝刷单网站怎么建设源代码,郑州seo优化公司,安徽城乡建设 厅网站,公司网站首页怎么设置前言 指针变量作为参数传递时,很容易混淆指针本身和指针指向的内容,实际应用中可能会导致无法预料的问题,所以做一下详细分析。 注意,在测试过程中为了看测试效果,有些指针变量分配了空间,但是未做回收&am…

前言

指针变量作为参数传递时,很容易混淆指针本身和指针指向的内容,实际应用中可能会导致无法预料的问题,所以做一下详细分析。
注意,在测试过程中为了看测试效果,有些指针变量分配了空间,但是未做回收,实际应用中要注意,分配空间后在合适的位置释放。

1. 指针变量直接作为参数传递

指针变量pVariant 作为实参传递给函数funcPointer,在funcPointer中由形参pParam接收

1.1 代码

void funcPointer(int *pParam)
{qDebug()<<"pParam  自身的地址:"<<&pParam<<"pParam  指向的地址:"<<pParam<<"pParam  值"<<*pParam;// 修改指针所指向地址中的内容*pParam = 2;qDebug()<<"pParam  自身的地址:"<<&pParam<<"pParam  指向的地址:"<<pParam<<"pParam  值"<<*pParam;// 修改pParam的指向pParam = new int;*pParam = 3;qDebug()<<"pParam  自身的地址:"<<&pParam<<"pParam  指向的地址:"<<pParam<<"pParam  值"<<*pParam;
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int *pVariant = new int;*pVariant = 1;qDebug()<<"pVariant自身的地址:"<<&pVariant<<"pVariant指向的地址:"<<pVariant<<"pVariant值"<<*pVariant;funcPointer(pVariant);qDebug()<<"pVariant自身的地址:"<<&pVariant<<"pVariant指向的地址:"<<pVariant<<"pVariant值"<<*pVariant;return a.exec();
}

1.2 输出结果:

1. pVariant自身的地址: 0x77fe04 pVariant指向的地址: 0x1986708 pVariant值 1
2. pParam  自身的地址: 0x77fdd0 pParam  指向的地址: 0x1986708 pParam  值 1
3. pParam  自身的地址: 0x77fdd0 pParam  指向的地址: 0x1986708 pParam  值 2
4. pParam  自身的地址: 0x77fdd0 pParam  指向的地址: 0x1986848 pParam  值 3
5. pVariant自身的地址: 0x77fe04 pVariant指向的地址: 0x1986708 pVariant值 2

1.2.1 结果分析:

  • 从1,2可以看出,pVariant和pParam 本身的存储地址不相同,指向的地址和pVariant相同,说明pParam是pVariant的一个拷贝。
  • 从2,3,5可以看出,通过函数funcPointer可以成功修改指针所指向的地址中的内容。
  • 从1,3,4,5可以看出,修改形参pParam指向的地址后,不会影响实参pVariant。
    综上,一级指针变量直接做为参数传递时,函数中会产生一个临时拷贝,通过这个拷贝可以修改原指针变量所指向地址的内容,但是不能改变原指针的指向。

1.3 在函数funcPointer最后增加回收空间操作:

    delete pParam;pParam = nullptr;qDebug()<<"pParam  自身的地址:"<<&pParam<<"pParam  指向的地址:"<<pParam;

1.3.1 输出结果:

1. pVariant自身的地址: 0x77fe04 pVariant指向的地址: 0x31265e8 pVariant值 1
2. pParam  自身的地址: 0x77fdd0 pParam  指向的地址: 0x31265e8 pParam  值 1
3. pParam  自身的地址: 0x77fdd0 pParam  指向的地址: 0x31265e8 pParam  值 2
4. pParam  自身的地址: 0x77fdd0 pParam  指向的地址: 0x3126768 pParam  值 3
5. pParam  自身的地址: 0x77fdd0 pParam  指向的地址: 0x0
6. pVariant自身的地址: 0x77fe04 pVariant指向的地址: 0x31265e8 pVariant值 2

从结果可以看出,如果形参pParam 执行new重新分配了空间,即此时pParam 和pVariant指向的地址不同,那么在函数中回收指针空间时只能操作pParam,不会回收指针变量pVariant的空间,所以此时想回收指针变量pVariant空间的话,需要在外部回收。

1.3.2 funcPointer函数中去掉pParam的new操作,增加delete

void funcPointer(int *pParam)
{qDebug()<<"pParam  自身的地址:"<<&pParam<<"pParam  指向的地址:"<<pParam<<"pParam  值"<<*pParam;// 修改指针所指向地址中的内容*pParam = 2;qDebug()<<"pParam  自身的地址:"<<&pParam<<"pParam  指向的地址:"<<pParam<<"pParam  值"<<*pParam;delete pParam;pParam = nullptr;qDebug()<<"pParam  自身的地址:"<<&pParam<<"pParam  指向的地址:"<<pParam;
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int *pVariant = new int;*pVariant = 1;qDebug()<<"pVariant自身的地址:"<<&pVariant<<"pVariant指向的地址:"<<pVariant<<"pVariant值"<<*pVariant;funcPointer(pVariant);qDebug()<<"pVariant自身的地址:"<<&pVariant<<"pVariant指向的地址:"<<pVariant<<"pVariant值"<<*pVariant;return a.exec();
}

1.3.3 输出结果

pVariant自身的地址: 0x77fe04 pVariant指向的地址: 0x19267e8 pVariant值 1
pParam  自身的地址: 0x77fdd0 pParam  指向的地址: 0x19267e8 pParam  值 1
pParam  自身的地址: 0x77fdd0 pParam  指向的地址: 0x19267e8 pParam  值 2
pParam  自身的地址: 0x77fdd0 pParam  指向的地址: 0x0
pVariant自身的地址: 0x77fe04 pVariant指向的地址: 0x19267e8 pVariant值 1761789996

从结果可以看出,执行 delete pParam; pParam = nullptr;后,pVariant指向的空间也已经被回收,但是pVariant不为空,依然指向原来的地址,获取到了一个未定义的值,这样可能导致程序出现不可控的问题。

2.指针变量作为引用参数传递

2.1 代码

void funcRefPointer(int *&pParam)
{qDebug()<<"pParam  自身的地址:"<<&pParam<<"pParam  指向的地址:"<<pParam<<"pParam  值"<<*pParam;*pParam = 2;qDebug()<<"pParam  自身的地址:"<<&pParam<<"pParam  指向的地址:"<<pParam<<"pParam  值"<<*pParam;pParam = new int;*pParam = 3;qDebug()<<"pParam  自身的地址:"<<&pParam<<"pParam  指向的地址:"<<pParam<<"pParam  值"<<*pParam;
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int *pVariant = new int;*pVariant = 1;qDebug()<<"pVariant自身的地址:"<<&pVariant<<"pVariant指向的地址:"<<pVariant<<"pVariant值"<<*pVariant;funcRefPointer(pVariant);qDebug()<<"pVariant自身的地址:"<<&pVariant<<"pVariant指向的地址:"<<pVariant<<"pVariant值"<<*pVariant;return a.exec();
}

2.2 输出结果:

1. pVariant自身的地址: 0x77fe04 pVariant指向的地址: 0x34665f8 pVariant值 1
2. pParam  自身的地址: 0x77fe04 pParam  指向的地址: 0x34665f8 pParam  值 1
3. pParam  自身的地址: 0x77fe04 pParam  指向的地址: 0x34665f8 pParam  值 2
4. pParam  自身的地址: 0x77fe04 pParam  指向的地址: 0x3466738 pParam  值 3
5. pVariant自身的地址: 0x77fe04 pVariant指向的地址: 0x3466738 pVariant值 3

2.2.1结果分析:

pParam 和 pVariant的存储地址、指向地址和内容完全一致。
指针变量作为引用传递时,形参pParam是指针变量pVariant的一个别名,对pParam的操作相当于对pVariant直接进行操作。引用传递时可以修改原指针的指向,可以修改指向地址的内容。

2.3在函数funcRefPointer最后增加回收空间操作:

    delete pParam;pParam = nullptr;qDebug()<<"pParam  自身的地址:"<<&pParam<<"pParam  指向的地址:"<<pParam;

2.3.1输出结果:

pVariant自身的地址: 0x77fe04 pVariant指向的地址: 0x3496638 pVariant值 1
pParam  自身的地址: 0x77fe04 pParam  指向的地址: 0x3496638 pParam  值 1
pParam  自身的地址: 0x77fe04 pParam  指向的地址: 0x3496638 pParam  值 2
pParam  自身的地址: 0x77fe04 pParam  指向的地址: 0x3496878 pParam  值 3
pParam  自身的地址: 0x77fe04 pParam  指向的地址: 0x0
pVariant自身的地址: 0x77fe04 pVariant指向的地址: 0x0
从结果可以看出,引用传递指针变量时,在函数中所有对引用变量的操作,都会影响原来的指针,包括delete操作,所以引用传递时,如果确定此指针之后不再使用,那么可以在函数中释放空间并将指针置空。detele指针并置为nullptr后,无法再获取指针指向的内容。

3.使用二级指针传递

传递指针变量的地址

3.1 代码

void funcPPointer(int **pParam)
{qDebug()<<"pParam  自身的地址:"<<&(*pParam)<<"pParam  指向的地址:"<<*pParam<<"pParam  值"<<**pParam;**pParam = 2;qDebug()<<"pParam  自身的地址:"<<&(*pParam)<<"pParam  指向的地址:"<<*pParam<<"pParam  值"<<**pParam;*pParam = new int;**pParam = 3;qDebug()<<"pParam  自身的地址:"<<&(*pParam)<<"pParam  指向的地址:"<<*pParam<<"pParam  值"<<**pParam;
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int *pVariant = new int;*pVariant = 1;qDebug()<<"pVariant自身的地址:"<<&pVariant<<"pVariant指向的地址:"<<pVariant<<"pVariant值"<<*pVariant;funcPPointer(&pVariant);qDebug()<<"pVariant自身的地址:"<<&pVariant<<"pVariant指向的地址:"<<pVariant<<"pVariant值"<<*pVariant;return a.exec();
}

3.2 输出结果

pVariant自身的地址: 0x77fdec pVariant指向的地址: 0x35166c8 pVariant值 1
pParam  自身的地址: 0x77fdec pParam  指向的地址: 0x35166c8 pParam  值 1
pParam  自身的地址: 0x77fdec pParam  指向的地址: 0x35166c8 pParam  值 2
pParam  自身的地址: 0x77fdec pParam  指向的地址: 0x3516748 pParam  值 3
pVariant自身的地址: 0x77fdec pVariant指向的地址: 0x3516748 pVariant值 3

二级指针传递时,输出结果和引用传递一样,因为都相当于传递了原指针的地址。

3.3 在函数funcPPointer最后增加:

    delete (*pParam);(*pParam) = nullptr;qDebug()<<"pParam  自身的地址:"<<&(*pParam)<<"pParam  指向的地址:"<<*pParam;

3.4 输出结果:

pVariant自身的地址: 0x77fe04 pVariant指向的地址: 0x34967a0 pVariant值 1
pParam  自身的地址: 0x77fe04 pParam  指向的地址: 0x34967a0 pParam  值 1
pParam  自身的地址: 0x77fe04 pParam  指向的地址: 0x34967a0 pParam  值 2
pParam  自身的地址: 0x77fe04 pParam  指向的地址: 0x3496730 pParam  值 3
pParam  自身的地址: 0x77fe04 pParam  指向的地址: 0x0
pVariant自身的地址: 0x77fe04 pVariant指向的地址: 0x0

增加delete后的输出结果也和引用传递时相同。所以,指针变量作为引用和二级指针的方式传递时,效果相同。

注意事项

1. delete指针后,如果不将指针置为nullptr,会产生野指针,指针仍会指向原来的地址,再次使用可能会导致程序崩溃,或者会得到一个不确定的值,导致程序产生不可控的结果。
2. 使用引用传递或者二级指针传递时,在函数中重新分配空间之前,需要将上一次new分配的空间回收,否则会造成内存泄漏。也就是多次new的时候需要对应的delete。
3. 如果需要使用调用接口的方式释放指针空间时,需要使用二级指针或者引用传递指针变量的方式,也就是直接传递指针变量的地址。如果直接使用指针传递,能够正常回收空间,但是无法将实参指针置为空值,导致其成为野指针,从而引起内存问题。

http://www.hkea.cn/news/867269/

相关文章:

  • 监控做直播网站免费网站seo
  • 网站建设洪塔网站搜索优化排名
  • 专业做设计师品牌网站深圳百度总部
  • 网站兼容工具seo关键词排名优化教程
  • O2O网站制作需要多少钱美区下载的app怎么更新
  • 上海做网站 公司做电商必备的几个软件
  • caozi.com网站建设中百度指数如何分析数据
  • 互联网舆情处置公司武汉seo外包平台
  • 消防器材网站建设背景seo工作职位
  • 专业网站制作公司名称seo咨询茂名
  • 做b2c网站建网站seo
  • 代理注册香港公司seo技术交流论坛
  • 想要提高网站排名应该怎么做seo网站推广费用
  • 专业做食材网站seo链接优化建议
  • 做画册的网站附近哪里有计算机培训班
  • 大兴建站推广google登录
  • 长春个人做网站哪家好百度指数热度榜
  • 嘉兴手机网站开发费用百度学术论文官网入口
  • 刷业务网站怎么做seo关键词挖掘
  • 企业移动网站品牌苏州网站外包
  • 网站建设流程 文档东莞seo技术
  • 公众号开发网站建设合同信息流广告投放流程
  • 长清网站建设费用友情链接出售平台
  • 先做网站再付款百度推广的广告真实可信吗
  • 湖南省人民政府一事一办企业网站seo排名优化
  • 深圳招聘网官方网站网站搜索引擎优化
  • 怎么知道一个网站是谁做的中国最大的企业培训公司
  • m2c是什么意思南昌百度seo
  • 专业做羽绒服的服装网站域名注册网
  • 公司网站建设需要显示什么软件世界球队最新排名