【问题标题】:append on c (pointers of pointers)在 c 上附加(指针的指针)
【发布时间】:2021-12-19 09:35:33
【问题描述】:

我刚开始学习C语言,我不能完全理解为什么我们应该使用指针的指针来将元素附加到表中(*tab)。 这是代码:

#include "append.h"

int append(int ** tab, size_t *size, int value){
    int *nouveauTab = realloc(*tab, (*size + 1) * sizeof(int));
    if (nouveauTab == NULL){
        return 0;
    }
    *tab = nouveauTab;
    (*tab)[*size] = value;
    (*size)++;
    return 1;
}

【问题讨论】:

  • 这有点取决于tab 的开头。您需要提供一些上下文。

标签: c pointers pass-by-reference function-declaration


【解决方案1】:

如果不使用指针指向指针,则指针选项卡将按值传递。也就是说,该函数将处理原始指针值的副本。更改副本不会影响原始指针。它将保持不变,因为在函数中更改的是它的副本。

所以你需要通过引用来传递指针。

在 C 中,通过引用传递意味着通过指向对象的指针间接传递对象(指针就是对象)。因此,取消引用指针,函数将直接访问原始对象。如果你的函数指向原始指针,就像

*tab = nouveauTab;

【讨论】:

    【解决方案2】:

    简短的回答是:因为您想更改 append 的调用者中的指针值。这发生在这里:*tab = nouveauTab;

    调用append 函数的代码如下所示:

    int* table = NULL;
    size_t table_size = 0;
    if (append(&table, &table_size, 42) == 0)
    {
        puts("append failed");
    }
    else
    {
        printf(size is now %zu and element %zu is %d", table_size, table_size-1, table[table_size-1]);
    }
    

    因此,您的代码预计append(成功时)将更改tabletable_size 的值。这要求您将函数指针传递给这两个变量。

    如果你这样做没有 usinb指针,即喜欢:

    if (append(table, table_size, 42) == 0)
    

    函数将无法更改它们的值,因为 C 只会传递它们当前值的副本。

    一个使用int的简单示例

    void foo(int x)
    {
        x = x + 1;
        printf("%d\n", x);
    }
    
    int x = 42;
    printf("%d\n", x);
    foo(x);
    printf("%d\n", x);
    

    将打印

    42
    43
    42  <--- x not changed by `foo` because we passed the value of x (i.e. 42)
    

    但是有了这个:

    void foo(int* x)
    {
        *x = *x + 1;
        printf("%d\n", *x);
    }
    
    int x = 42;
    printf("%d\n", x);
    foo(&x);
    printf("%d\n", x);
    

    它会打印出来

    42
    43
    43  <--- x was changed by `foo` because we passed a pointer
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-24
      • 2018-05-27
      • 2021-12-31
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 2023-04-05
      • 2014-06-26
      相关资源
      最近更新 更多