#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)和指针的引用(*&amp;)使用案例分析的更多相关文章

  1. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

  2. C++C++ 指针(二)--c++ 指针(二)--c++

    一.内存管理:new和delete 1.new操作符:从操作系统获得内存块,并返回该内存块的首地址. delete操作符:将new申请的内存返还给操作系统. 开始一个简单的例子: #include & ...

  3. 【c实现,vc6调试通过】给出一字符串指针,计算出字符串指针中单词数

    #include <stdio.h> /* 给出一字符串指针,计算出字符串指针中单词数, 单词不包括'.',',',';','?','_','"',由0-9数字或26个字母组成 ...

  4. const 指针与指向const的指针

    最近在复习C++,指针这块真的是重难点,很久了也没有去理会,今晚好好总结一下const指针,好久没有写过博客了,记录一下~ const指针的定义: const指针是指针变量的值一经初始化,就不可以改变 ...

  5. Qt 智能指针学习(7种指针)

    Qt 智能指针学习 转载自:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ ...

  6. C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针

    C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针 (1)开辟的内存没有释放,造成内存泄露 (2)野指针被使用或释放 (3)非法释放指针 (1)开辟的内存没有释放.造成内存泄露,以下的样 ...

  7. 终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good

    这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ------------------------------------------------- ...

  8. C语言指针2(空指针,野指针)

    //最近,有朋友开玩笑问 int *p  *是指针还是p是指针还是*p是指针,当然了,知道的都知道p是指针 //野指针----->>>指没有指向一个地址的指针(指针指向地址请参考上一 ...

  9. Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

    Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇 ...

随机推荐

  1. Android学习笔记27:网格视图GridView的使用

    网格视图GridView的排列方式与矩阵类似,当屏幕上有很多元素(文字.图片或其他元素)需要按矩阵格式进行显示时,就可以使用GridView控件来实现. 本文将以一个具体的实例来说明如何使用GridV ...

  2. Ubuntu安装JDK(tar.gz)

    如果没有创建root用户: sudo passwd root 在oracle官网下载jdk(百度"JDK")的tar.gz包: jdk-7u55-linux-x64.gz 这是我下 ...

  3. odi增量更新策略

    增量更新策略:通过一个“update key”比较流数据记录与目标表中的记录比较进行数据整合.具有相同“update key”的记录当相关联列不同时将被更新:在目标表中不存在的记录将被插入.这种方式用 ...

  4. oracle 查询表的大小,表空间的使用情况,默认表空间

    oracle 查询表的大小,表空间的使用情况,默认表空间 oracle 查询表的大小,表空间的使用情况,默认表空间 --查看某张表占用磁盘空间大小 ( 表名大写 ) Select Segment_Na ...

  5. Saiku对Measure(指标)查询结果进行计算后显示的方法

    在通过Saiku查询数据的时候,当需要改变查询结果的显示方式的时候,可以添加formatString属性,但是当需要计算查询结果的时候,则需要使用CellFormatter,使用方法如下: <M ...

  6. 通过pull解析器操作安卓的xml

    通过pull解析器操作安卓的xml 例子定义了一个javabean用于存放上面解析出来的xml内容, 这个javabean为Person,代码请见本页下面备注: =================== ...

  7. 【百度地图API】获取行政区域的边界

    );map.addControl(new BMap.NavigationControl({type: BMAP_NAVIGATION_CONTROL_SMALL}));map.enableScroll ...

  8. Csharp多态的实现(接口)

    1.什么是接口 接口可以看做是一个标准, 所有继承的子类需要按照接口中声明的方法来 接口用关键字 interface 修饰,接口的名字一般是I.........able ,表示我有什么能力 接口一般是 ...

  9. BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )

    一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状 ...

  10. 彻底解决 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    最近我的VS2010不知道怎么回事,平时用的好好的,近期竟然出现了所谓的 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 头痛万分,查了各种资料一 ...