再看传指针

Posted codeworkerliming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了再看传指针相关的知识,希望对你有一定的参考价值。


#include<stdio.h> #include<stdlib.h> void getMemery(int *pt) printf("pt=%p\\n",pt); printf("&pt=%p\\n",&pt); /*申请1024个int大小*/ pt = malloc(sizeof(int) * 1024); if (NULL == pt) printf("malloc failed\\n"); pt = NULL; int main(void) int *p = NULL; printf("address of &p is %x\\n", &p); getMemery(p); printf("address of p is %p\\n", 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\\n",pt);
    printf("&pt=%p\\n",&pt);

    /*申请1024个int大小*/
    *pt = malloc(sizeof(int) * 1024);

    if (NULL == *pt)
    
        printf("malloc failed\\n");
        *pt = NULL;
    

int main(void)

    int *p = NULL;
    printf("address of &p is %x\\n", &p);
    getMemery(&p);
    printf("address of p is %p\\n", 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

以上是关于再看传指针的主要内容,如果未能解决你的问题,请参考以下文章

函数与指针探究

分析轮子- LinkedList.java

再看数据库——连接

typedef声明变量也是一种求值过程

❤️导图整理大厂面试高频数组8: 移除元素的双指针优化, 力扣27❤️

pwnable.tw seethefile