C/C++指针的指针(**p)和指针的引用(*&)使用案例分析
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
int func1(int *a)
{
a = new int;
*a = 1;
printf("func1 addr a=%p\n",a);
return *a;
}
int func2(int **a)
{
*a = new int;
**a = 10;
//假设是指针的指针,那函数内能够对指针的指针直接赋值
//那返回的地址就彻底悲剧了,函数外面的指向彻底乱了
//int i = 0,*b = 0;
//b = &i;
//对指针的指针直接赋值,有可能不这么直接,间接被改动
//a = &b;
printf("func2 addr a=%p,*a=%p\n",a,*a);
return **a;
}
//*&: 运算符*优先级高于&,两个运算符都是从右向左结合运算;//所以,*&a 的意思就是先运算 *,得到 指针,再通过 &,获取指针的引用
//typedef int * INT_P;INT_P a 等同于 int *a,那 INT_P &a 就等同于 int *&a,也即指针的引用了
int func3(int *&a)
{
a = new int;
*a = 100;
//int i = 0,*b = 0;
//b = &i;
//由于是指针的引用,不能对其进行赋值
//确保了函数调用完毕后,地址指向不会乱
//&a = &b;
printf("func3 addr a=%p,&a=%p\n",a,&a);
return *a;
}
int main (int argc, char *argv[])
{
int a = 0,*p = 0;
a = func1(p);
printf("a=%d,addr a=%p,addr p=%p,&p=%p\n\n",a,&a,p,&p);
a = func2(&p);
printf("a=%d,addr a=%p,addr p=%p,&p=%p\n\n",a,&a,p,&p);
a = func3(p);
printf("a=%d,addr a=%p,addr p=%p,&p=%p\n\n",a,&a,p,&p);
printf ("%s\r\n", "finish");
return 0;
}
/*
编译运行
g++ -m32 -g aa.c -o aa;./aa
func1 addr a=0x9fc3008
a=1,addr a=0xffc59bdc,addr p=(nil),&p=0xffc59bd8
func2 addr a=0xffc59bd8,*a=0x9fc3018
a=10,addr a=0xffc59bdc,addr p=0x9fc3018,&p=0xffc59bd8
func3 addr a=0x9fc3028,&a=0xffc59bd8
a=100,addr a=0xffc59bdc,addr p=0x9fc3028,&p=0xffc59bd8
finish
*/
/*
func1:
[&p=0xffc59bd8]----->[p=null]------>null
func2:
[&p=0xffc59bd8]----->[p=0x9fc3018]------>10
func3:
[&p=0xffc59bd8]----->[p=0x9fc3028]------>100
1. 函数 func1 调用后,func1函数内部内存泄漏,返回的指针还是无效;
2. 函数 func2 调用后,返回了合法的地址,其指针的地址也全然匹配;
3. 函数 func3 调用后,返回了合法的地址,其指针的地址也全然匹配;
注意看 &p=0xffc59bd8 的地址一直不变,可是p的指向一直再变,实际能够用
一个简单的映射描写叙述:
int **pp = 5;
[pp=0x***]---->[*pp=0x****]---->[**p = 5]
*/
C/C++指针的指针(**p)和指针的引用(*&)使用案例分析的更多相关文章
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, con ...
- C++C++ 指针(二)--c++ 指针(二)--c++
一.内存管理:new和delete 1.new操作符:从操作系统获得内存块,并返回该内存块的首地址. delete操作符:将new申请的内存返还给操作系统. 开始一个简单的例子: #include & ...
- 【c实现,vc6调试通过】给出一字符串指针,计算出字符串指针中单词数
#include <stdio.h> /* 给出一字符串指针,计算出字符串指针中单词数, 单词不包括'.',',',';','?','_','"',由0-9数字或26个字母组成 ...
- const 指针与指向const的指针
最近在复习C++,指针这块真的是重难点,很久了也没有去理会,今晚好好总结一下const指针,好久没有写过博客了,记录一下~ const指针的定义: const指针是指针变量的值一经初始化,就不可以改变 ...
- Qt 智能指针学习(7种指针)
Qt 智能指针学习 转载自:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ ...
- C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针
C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针 (1)开辟的内存没有释放,造成内存泄露 (2)野指针被使用或释放 (3)非法释放指针 (1)开辟的内存没有释放.造成内存泄露,以下的样 ...
- 终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good
这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ------------------------------------------------- ...
- C语言指针2(空指针,野指针)
//最近,有朋友开玩笑问 int *p *是指针还是p是指针还是*p是指针,当然了,知道的都知道p是指针 //野指针----->>>指没有指向一个地址的指针(指针指向地址请参考上一 ...
- Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值
Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇 ...
随机推荐
- 搜索服务器xunsearch实现
安装方法: centos 6.6 64位 histroy: 12 cd /srv/ 13 wget http://www.xunsearch.com/download/xunsea ...
- Hibernate之总结
以前做.net,最近做java项目,负责服务端的开发,直接用的jdbc,线程安全问题.缓存同步问题以及连接池什么的,都是手动写,不但麻烦而且容易出错.项目结束,赶快抽时间学了下hibernate,每天 ...
- UIKit之浅析UIButton
UIButton * button =[[UIButton alloc]init]; button.backgroundColor=[UIColor redColor]; [button setTit ...
- sqlite3编译与查询
1.sqlite3 http://www.sqlite.org/ 下载 wget http://www.sqlite.org/2014/sqlite-amalgamation-3080403.zip ...
- ELMAH+MVC4+SQLite 错误日志
任何程序我想无论是在调试开发阶段还是上线运营阶段,都能够使人“放心”,不要出什么意外,也不要玩什么心跳:那就需要比较到位和及时的异常与错误日志模块. 本文将简要描述ELMAH.MVC4与SQLite这 ...
- DEM 数据下载
https://centaurus.caf.dlr.de:8443/short_guide/index.html https://centaurus.caf.dlr.de:8443/eoweb-ng/ ...
- SVN使用Tips
1. 如果在本地删除了某个文件,在Cornerstone上的本地仓库会出现D的标志,并且文件不存在. 这时,只需要将该文件提交到服务器上,本地仓库就会清除了已删除的文件的标识,同时,服务器上也会自动删 ...
- asp.net MVC Razor 语法(3)
编程逻辑:执行基于条件的代码. If 条件 C# 允许您执行基于条件的代码. 如需测试某个条件,您可以使用 if 语句.if 语句会基于您的测试来返回 true 或 false: if 语句启动代码块 ...
- JavaScript对css样式表操作
CSS样式表3种方式: 内嵌:写在html标签中的样式 :如:<p style="width:100px"> 内嵌</p> 内联:写在html 中<h ...
- AdventureWorks2008 数据库安装
我使用的操作系统是 win 8.1,由于对早前安装的sql server 2008的兼容性不太好,要安装对应的service pack来解决一下这个问题. 如何使用 SQL Server 在 Wind ...