传递双指针作为参数

时间:2016-02-05 18:32:04

标签: c

我想使用双指针。但是,请告诉我这里做错了什么。调用函数后,值n不会更新。我期待30但仍然看到10。

int main(int argc, char **argv) {
    int n = 10;
    int *ptr = &n;
    int **ptr2ptr = &ptr;
    function(&ptr2ptr);
    printf("%d", n);
    return 0;
}

void function(int *num) {
    *num = 30; 
}

9 个答案:

答案 0 :(得分:6)

您实际上是将三重间接整数传递给函数function&ptr2ptr是指向整数指针的指针的地址。在从function调用之前,您没有定义或声明main。它在C99中是不正确的,但在ANSI C中受支持并隐式声明function以获取任何类型的任意数量的参数并返回int。您应该在function之前移动main的定义,并将其更改为:

void function(int ***num) {
    ***num = 30; 
}

答案 1 :(得分:3)

您使用Collections.sort(results, new UserLocationComparator(sLatlong)); 而不是&ptr2ptr传递三重指针并且您的函数采用指针而不是指向指针的指针(*ptr2ptr而不是{{1 }})。

另一种看待它的方法是int *获取指针的地址,它不会取消引用它。你想要的是:

int **

但是为了让你能够看到更多的错误,我采取了更长的路线 - 你可以查看这个更新的代码并阅读评论以获取更多信息。

请记住,在C:"用法==声明"

意味着声明中的&ptr2ptr在使用中引用指针并使用function(*ptr2ptr); 取消引用(使用)指针。

*将返回对象的地址。

这里有一些代码可以显示差异:

*

答案 2 :(得分:2)

由于您正在更新传递给函数的指针所指向的值,因此无需将指针传递给指针(您实际上是将指针传递给指向指针)。
函数function需要int *类型,因此只需传递ptr。你必须改变函数调用

function(&ptr2ptr);  

function(ptr);  

除此之外,您还必须包含函数function的函数原型,或者在main之前定义它。

答案 3 :(得分:2)

#include <stdio.h>

void function(int** num)
{
    **num = 30;
}

int main(int argc, char**argv)
{
    int n = 10;
    int* ptr = &n;
    int** ptr2ptr = &ptr;
    function(ptr2ptr);
    printf("%d\n",n);
    return 0;
}

答案 4 :(得分:2)

您必须为函数使用良好的输入类型:int **。

如果你添加一些像-pedantic这样的gcc标志,你会发现你在类型上犯了一些错误。

您的计划的工作版本是:

#include <stdio.h>

void function(int** num);

int main(int argc, char**argv) {
    int n = 10;
    int* ptr = &n;
    int** ptr2ptr = &ptr;
    function(ptr2ptr);
    printf("%d",n);
    return 0;
}

void function(int** num)
{
    **num = 30;
}

请注意,您不需要双指针来做您想做的事,一个简单就足够了。

答案 5 :(得分:2)

让我为您评论您的代码并解释发生了什么:

int main(int argc, char **argv) {

    int n = 10; //declaring variable n type int

    //declaring variable ptr type int * setting it to address of n
    int *ptr = &n;  

    //declaring variable ptr2ptr as int** and setting it to address of ptr
    int **ptr2ptr = &ptr;

    //now you are trying to take the address of ptr2ptr, which is the address of an int**
    //this gives you an int***, you are passing this in function with undesirable behaviour
    function(&ptr2ptr);
    printf("%d", n);
    return 0;
}

void function(int *num) //take in a parameter of type int*
{
    *num = 30; //dereference it and put value 30 in it
}

您应拨打function(&ptr2ptr)或更好function(*ptr2ptr)

,而不是致电function(ptr)

答案 6 :(得分:2)

让我们仔细查看代码的每一行:

int main(int argc, char **argv) {
    int n = 10;

n被声明为int

    int *ptr = &n;

ptr被声明为指向int的指针,并分配了n的地址。

    int **ptr2ptr = &ptr;

ptr2ptr被声明为指向指针的指针,并指定了ptr的地址。这就是我假设你称之为“双指针”。

    function(&ptr2ptr);

现在您将ptr2ptr的地址发送到function()。请注意,您尝试传递给function()的值是指向指针指向int的指针(即“三指针”)。

    printf("%d", n);
    return 0;
}

void function(int *num) {

function()声明为pointer-to-int。这意味着main()中的函数调用应该导致编译器错误,因为参数类型与参数类型不匹配。

    *num = 30; 
}

如上所述,您的代码不应该编译。您正在将三重指针(int***)传递给仅接受单个指针(int*)的函数。您至少有3种可能的修复方法:

  1. 声明function()采用三重指针:

    void function(int*** num) {
        ***num = 30; 
    }
    
  2. 声明function()采用双指针:

    void function(int **num) { 
        **num = 30; 
    }
    

    并将main中的函数调用更改为

    function(ptr2ptr);
    
  3. 由于您只是尝试更改单个int的值,因此这两个似乎都是完全没必要的。这意味着您可以使用单个指针完成所需的所有操作:

    void function(int *num) { 
        *num = 30; 
    }
    

    现在您可以使用

    调用此函数
    function(ptr);
    

    function(&num);
    

答案 7 :(得分:2)

你的函数void function(int *num)有一个参数,那是一个指向int的指针,所以当你调用它时,你应该为它提供一个整数的地址,而不是指向{的指针的地址。 {1}},也指向int的指针地址。

int

答案 8 :(得分:0)

void function(int ***num) {
  ***num = 30; 
}

int main(int argc, char **argv) {
  int n = 10;
  int *ptr = &n;
  int **ptr2ptr = &ptr;
  function(&ptr2ptr);
  printf("%d", n);
  return 0;
}

What you did was give the address of double pointer, so it became triple pointer. Do the above it works fine.

Since code might get complex with triple pointer, just use a double pointer instead of sending address of double pointer:

void function(int **num) {
  **num = 30; 
}

int main(int argc, char **argv) {
  int n = 10;
  int *ptr = &n;
  int **ptr2ptr = &ptr;
  function(ptr2ptr);
  printf("%d", n);
  return 0;
}