首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使用int** ar而不是int* ar?

为什么使用int** ar而不是int* ar?
EN

Stack Overflow用户
提问于 2022-03-12 03:00:25
回答 2查看 105关注 0票数 1
代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
void input(int **ar, int *n) {
    printf("Number of elements: ");
    scanf("%d", n);
    *ar = (int*)malloc(*n * sizeof(int));
    //*ar = new int[*n];
    for (int i = 0; i < *n; ++i){
        printf("Element %d:", i);
        scanf("%d", &(*ar)[i]);
    }
    return;
}
void output(int *ar, int n) {
    for (int i = 0; i < n; ++i) {
        printf("%5d\n", ar[i]);
    }
    return;
}
int main() {
    int n = 0;
    int *ar = NULL;
    input(&ar, &n);
    output(ar, n);
    free(ar);
    return 0;
}

所以我刚刚在我的大学里学到了C的指针。例如,我不明白为什么input函数中的input是一个int**而不是一个int*。我的意思是,我尝试用int* ar替换int* ar,并在main函数中删除int* ar = NULL中的*,并且没有编译错误。当我运行这个程序时,一切都很好。我输入元素的数量并在这些元素中输入一些值,但是,当我在最后一个元素中输入最后一个数字时,我将一无所获。所以我取消了一切,程序又正常工作了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-12 05:36:23

您发布的程序如下所示(如下所示):

  1. Declare/define : function
  2. Allocate内存中指向其他函数中的指针的指针,并在该内存中填充用户输入
  3. ,使用另一个function
  4. Deallocate内存打印该内存的内容,并退出

让你困惑的部分是2。

我不明白为什么输入函数中的ar是int**而不是int* .

如果您想将内存分配给指针(或者想要更改指针,例如,让它指向其他内存或重新分配内存等等)。在其他函数中,您需要访问该函数中的指针,如果您有该指针的地址,则可以访问该指针。

这就是为什么在这里传递ar指针的地址:

代码语言:javascript
复制
input(&ar, &n);

ar的地址传递给input()函数,在输入函数取消引用中,该地址(即*ar)将给出ar指针(在main()中声明/定义)。

为了更好地理解,我将input()函数的input()参数重命名为input_ar

代码语言:javascript
复制
void input(int *input_ar, int *n) {
    .....
    .....

input()函数从main()函数调用时,内存中的视图将如下所示:

代码语言:javascript
复制
    input_ar       ar
      +-----+       +-----+      
      | 200 | ----> | NULL|
      +-----+       +-----+

[200 is address of ar pointer]

input()函数中,当您这样做时:

代码语言:javascript
复制
*input_ar = (int*)malloc(*n * sizeof(int));

取消引用input_ar (即*input_ar)将给ar

代码语言:javascript
复制
    input_ar      *input_ar (ar)       (newly allocated memory block)
      +-----+            +-----+       +-----+
      | 200 | ---------> | 300 | ----> |     |
      +-----+            +-----+       +-----+

[300 is address of the newly allocated memory block]

因此,通过取消input_ar,可以在input()中更改指针ar

,我的意思是,我尝试用int* ar替换int** ar,删除主函数中的* int* ar = NULL,并且没有编译错误。

注意,如果从*中的ar声明中删除main(),那么ar将是一个int类型的变量,这意味着它将不是一个指针,而是一个可以容纳int类型值的变量。如果您在程序中进行此更改,则必须在其他地方进行更改,例如,您在input()函数中接受用户输入的方式,以及output()函数的相应更改等。

您还没有显示在从*声明中删除ar之后所做的更改的程序,因此,我将只讨论传递给input()ar参数。

这就是你可能尝试过的:

代码语言:javascript
复制
int ar;

input (&ar, &n);

input()

代码语言:javascript
复制
void input(int *ar, int *n) {
    printf("Number of elements: ");
    scanf("%d", n);
    ar = (int*)malloc(*n * sizeof(int));

    .....

注意,ar指针参数是input()函数的局部变量。当input()函数从main()函数调用时,ar将保存main()函数的ar变量的地址。如果需要,可以使用ar函数中的指针ar更改input()变量的值,例如- *ar = 9; -这将将值9赋给变量ar (of main())。内存中的视图应该如下所示

代码语言:javascript
复制
    ar (of input())          ar (of main())
      +-----+                +-----+      
      | 200 | -------------> |     |
      +-----+                +-----+

[200 is address of ar variable of main()]

但当你做的时候

代码语言:javascript
复制
ar = (int*)malloc(*n * sizeof(int));

ar丢失了main()函数的ar变量的地址,新分配的内存引用被分配给input()的指针ar

代码语言:javascript
复制
    ar (of input())          newly allocated memory block
      +-----+                +-----+      
      | 400 | -------------> |     |
      +-----+                +-----+

[400 is address of the newly allocated memory block]

您可以写入/修改这个内存中的内容,但是当从input()返回时,由于input()没有返回任何内容,这个内存引用将丢失,这将是程序中的内存泄漏。

票数 2
EN

Stack Overflow用户

发布于 2022-03-12 03:10:04

在这里使用指针的一个常见用法是允许函数调用更改一个变量的值。

例如,假设您有以下内容:

代码语言:javascript
复制
void
change_num(int num)
{
    num = 6;
}

int
main()
{
    int num = 5;
    change_num(num);
    printf("%i\n", num);

    return 0;
}

这不起作用,因为change_num正在更改自己的副本 of num,而不是num本身。

相反,您必须将指向num的指针传递给函数:

代码语言:javascript
复制
void
change_num(int* num_ptr)
{
    *num_ptr = 6;
}

int
main()
{
    int num = 5;

    change_num(&num);
    printf("%i\n", num);

    return 0;
}

*num_ptr = 6;行的意思是“将num_ptr指向的对象更改为6”。

在一般情况下,如果我们希望一个函数更改SomeType类型变量的值,那么我们必须将一个SomeType*传递给该函数。

在您的示例中,您希望更改ar的值,它是一个int*。现在,它不保存任何东西的地址(NULL),您希望将其更改为保存已分配数组的值(由malloc创建)。如果我们将int*传递给函数以更改int,而传递SomeType*以更改SomeType,则必须传递int**以更改int*

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71446627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档