通过引用函数传递指针

时间:2021-03-02 18:13:12

标签: c pointers

交流

#include "b.h"

typedef struct line_details {
    int line_num;
    char type[20];
} line_details;

line_details* ptr = NULL;
ptr = (*line_details) malloc(sizeof(line_details));

int x = 5;

do_something(x, &ptr);

b.c

void do_something(int n, line_details* ptr)
{
    /* some code */
}

b.h

void do_something(int n, line_details* ptr);

我想将指针的地址传递给函数 do_something 而不仅仅是指针的副本。当我这样做时,我得到 incompatible pointer type error。为什么?

3 个答案:

答案 0 :(得分:3)

  1. 您对 malloc 的转换是错误的,正确的转换是 (line_details *)。但那是如果你甚至want to cast malloc in the first place

  2. ptr 已经是一个指针。您通过 &ptr 传递的是 line_details *ptr 的地址,换句话说,是一个指向指针的指针。只需通过ptr

  3. 如果您的意图实际上是传递一个指向 ptr 的指针(即一个指向 line_details 的指针的指针),请将函数签名改为采用 line_details **,然后通过 &ptr

答案 1 :(得分:1)

代码中的几个问题如下。

  • 如果你想对 malloc 返回的指针进行类型转换,你必须 告诉您要类型转换的指针的类型,即 '''line_details*''' 不是 '''*line_details'''

  • ptr 本身就是一个指针。将 ptr 传递给函数就足够了。如果传递 &ptr,则它不是指针。是指针的地址。

修改后的程序如下。

#include "b.h"

typedef struct line_details {
    int line_num;
    char type[20];
} line_details;

line_details* ptr = NULL;
ptr = (line_details *) malloc(sizeof(line_details));

int x = 5;

do_something(x, ptr);

如果你想传递指针的地址,你需要像下面的例子一样改变函数。

do_something(x, &ptr);

void do_something(int n, line_details** ptr)
{
    /* some code */
}

答案 2 :(得分:1)

函数签名取决于函数应该用指针做什么。以下是一些示例。

...
     public function genRaport 
     {
        $date_from = $request->input("date_from");
        $date_to = $request->input("date_to");
        $user = $request->input("user");

        return \Excel::download(new UmowyRaport($date_from, $date_to, $user), 'raport_cars_'.date('d-m- 
        Y').'.xlsx');
     }
    
相关问题