美文网首页
C语言中的地址传递(传指针,传递给形参的指针仍然是实参指针的一份

C语言中的地址传递(传指针,传递给形参的指针仍然是实参指针的一份

作者: 记事本的记事本 | 来源:发表于2019-08-12 13:31 被阅读0次

先看一个例子:这个程序为什么会崩溃?

#include <stdio.h>
#include <stdlib.h>

int f(int *q)
{
    int a = 10;
    q = (int*)malloc(sizeof(int));
    *q = a;
    return 0;
}

int main()
{
    
    int *p = NULL;
    f(p);
    printf("%d", *p);
    return 0;
}

此处的q任然是p的一个拷贝,可以通过这个程序证明:

#include <iostream>


int f(int *q)
{
    std::cout << &q << std::endl;
    return 0;
}

int main()
{
    int a = 10;
    int *p = &a;
    f(p);
    std::cout <<  &p;
    return 0;
}
输出为: image.png

明指针p与指针q的地址是不同的,证明q是p的一个拷贝。

所以第一个程序崩溃的原因:函数中的q其实是实参p的一份拷贝,函数中的操作都是对q进行的,p仍然是NULL,所以输出*p的值产生崩溃!

可以把形参改为二级指针,程序便可以按预想中的情形进行:

#include <stdio.h>
#include <stdlib.h>

int f(int **q)
{
    int a = 10;
    *q = (int*)malloc(sizeof(int));
    **q = a;
    return 0;
}

int main()
{

    int *p = NULL;
    f(&p);
    printf("%d", *p);
    return 0;
}

相关文章

  • C语言中的地址传递(传指针,传递给形参的指针仍然是实参指针的一份

    先看一个例子:这个程序为什么会崩溃? 此处的q任然是p的一个拷贝,可以通过这个程序证明: 明指针p与指针q的地址是...

  • 嵌入式day09

    数组在函数间传参 全局数组传递方式 复制传递方式 实参为数组的指针,形参为数组名(本质是一个指针变量) 地址传递方...

  • 读书笔记17.06.02【stack】【vector】

    C++中参数传递:按值传递,指针传递和引用传递按值传递:形参是实参的拷贝。指针传递:拷贝指针,被调用函数对指针指向...

  • lc25 关于链表

    复习知识点:1)链表反转2)关于指针。理解C++中指针传参,大概指针传参也是传的形参(like int数字),但是...

  • 函数总结

    函数的基本构成 输入 实参传值给形参 传值参数:拷贝复制,基本类型和指针。 所以说,指针作为形参,只是存储了变量的...

  • 【golang】3.0 指针、数组、range关键字、Slice

    指针 指针在go语言中是一个很重要的概念,但比c语言简单多了。 指针简单在:指针不能运算参数传递:值传递还是引用传...

  • 内存四区图练习

    一个实参 一个形参 取地址 通过指针修改变量 返回多级指针的训练

  • 今日小结

    指针传参 在函数间指针变量做参传值,只传地址,不附带其他信息。故以数组名为指针变量被函数调用传参后,在调用函数内s...

  • C++第3天:第42课-第71课

    指针 本质:地址 优点:能节省内存空间。当在函数中进行值传递时,你的形参是实参的拷贝副本,实参有多大,形参就有多大...

  • 值传递、地址传递的笔记

    在C语言中,理解值传递、地址传递和引用传递非常重要,首先,我们得来区分一下指针变量、指针地址、指针的值之间的关系。...

网友评论

      本文标题:C语言中的地址传递(传指针,传递给形参的指针仍然是实参指针的一份

      本文链接:https://www.haomeiwen.com/subject/prxujctx.html