zoukankan      html  css  js  c++  java
  • 再看传指针


    #include<stdio.h> #include<stdlib.h> void getMemery(int *pt) { printf("pt=%p ",pt); printf("&pt=%p ",&pt); /*申请1024个int大小*/ pt = malloc(sizeof(int) * 1024); if (NULL == pt) { printf("malloc failed "); pt = NULL; } } int main(void) { int *p = NULL; printf("address of &p is %x ", &p); getMemery(p); printf("address of p is %p ", p); return 0; }

     如果是为指针p申请一段内存,上面的代码能达到目的吗? 

    通过前面的内容分析,肯定是达不到预期效果的。
    运行结果:

    这是为什么呢?我们还是利用前面所知来分析,由于传递给getMemory函数的参数都是一个副本,因此函数内的p也是外部p的一个副本,因此即便在函数内部,将p指向了一块新申请的内存,仍然不会改变外面p的值,即p还是指向NULL。

     上面的代码 指示把指针p的值NULL传给了pt,一开始我打印了,数值和地址就一目了然了。

    其实这两个指针是相互独立的,在内存中是相互独立的。pt申请了1024,不代表p就申请了。

    如何修改呢?我们需要传入p的地址,即指向int类型指针的指针。

    #include<stdio.h>
    #include<stdlib.h>
    void getMemery(int **pt)
    {
        printf("pt=%p
    ",pt);
        printf("&pt=%p
    ",&pt);
    
        /*申请1024个int大小*/
        *pt = malloc(sizeof(int) * 1024);
    
        if (NULL == *pt)
        {
            printf("malloc failed
    ");
            *pt = NULL;
        }
    }
    int main(void)
    {
        int *p = NULL;
        printf("address of &p is %x
    ", &p);
        getMemery(&p);
        printf("address of p is %p
    ", p);
        free(p);
        p = NULL;
        return 0;
    }
    

      

    从运行结果可以看到,p的值被改变了,而不再是初始的NULL。

    可配合下面的图进行理解

     int *p; 说明p申请了一个int 指针,&p说明p的地址是0x60fdb8,

    int **p; 二级指针,pt保存的是p的地址,0x60fdb8,

    *pt=*(&p)=p,就是对p进行操做了。 

    总结

    本文总结如下:

    • 函数的参数都是原数据的“副本”,因此在函数内无法改变原数据

    • 函数中参数都是传值,传指针本质上也是传值

    • 如果想要改变入参内容,则需要传该入参的地址(指针和引用都是类似的作用),通过解引用修改其指向的内容

    • 以上结论不限于C语言

    部分文字转载自https://mp.weixin.qq.com/s/u3m_31n2Se_9pMddsDWzSg

  • 相关阅读:
    最长回文子串
    学习与提升
    jupyter notebook nginx 试听录音文件,网页试听
    【神经网络】batch、epoch、iteration的含义
    【tensorflow】Tensorflow入门教程
    最全BAT面试题
    打印二叉树
    基于argparser模块实现 ls 功能(基本实现)
    比较详细的argpasrse模块的基本使用
    ini文件转换为Json文件
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/11450914.html
Copyright © 2011-2022 走看看