AKIHIY 2021-12-08 15:21 采纳率: 82.8%
浏览 35
已结题

一个关于c语言指针问题(int**和int*)

上面的例子是错误的,下面的是正确的,可以解析一下吗?
感觉上面的例子跟平时的函数传地址没有什么不同呀(例如简单的swap函数)

img


这是swap函数

void swap(int *p1,int *p2)
{
    int temp;
    temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}


  • 写回答

1条回答 默认 最新

  • 加拉萨假期 2021-12-08 17:07
    关注
    
    #include "stdio.h"
    #include "stdlib.h"
    
    //这个函数演示传入一个指向int类型数据的指针
    //然后尝试给该<指针>赋值
    void functionA(int *input) {
        //先打印一下传进来时的指针指向地址,发现是nil,很合理
        printf("1 %p\n", input);
        //malloc分配在内存成功后会返回一个指针,尝试把新指针赋值给我们传进来的指针input
       input = malloc(10);
       //在打印一下指针的指向的地址,发现是有地址的了(0x56283cf5c670),也很合理
        printf("2 %p\n", input);
    
        //这个释放是我知道会发生内存泄漏才写在这的,如果不明白你问的问题,就会漏掉这个,发生内存泄漏
        free(input);
    }
    
    int main()
    {
        int *data = NULL; //声明
        functionA(data);  //传入
    
        //这里再次打印,发现data=nil,意思是data没有能在functionA里面重新赋值成功
        printf("3 %p\n", data);
    }
    
    //为什么呢?
    //首先传参是拷贝你传进去的东西,然后再在函数内部使用这个拷贝值.
    //你传的是一个int*,这个类型的值是一个uint,
    // input的值就是一个uint,代表内存地址,而*input的意思是uint指向的内存地址的里面的内容,并且其内容类型为int
    //所以  input = malloc(10);  这句话的意思是一个uint赋值给了另一个uint,跟内存完全没有关系
    //我们真正关心的其实是指针指向的内容
    //
    //所以,使用 void functionA(int **input) 
    //**input的意思是: input是一个指针,它指向一个内存地址,里面还存了一个指向int型数据的指针
    //因此  *input = malloc(10) 才能真正达到传进去再重新分配内存的目的
    //如下:
    
    /*
    void functionA(int **input) {
        printf("1 %p\n", *input);
       *input = malloc(10);
        printf("2 %p\n", *input);
    }
    int main()
    {
        int *data = NULL; 
        functionA(&data);  
        printf("3 %p\n", data);
    }
    */
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月19日
  • 已采纳回答 12月11日
  • 创建了问题 12月8日