【问题标题】:The purpose of a triple pointer in C [duplicate]C中三重指针的目的[重复]
【发布时间】:2018-10-17 06:41:50
【问题描述】:

虽然我在这方面看到了一些线程,但我无法理解三重指针背后的含义,因为似乎没有它们也可以做同样的事情。

void Reading(int *N, int ***M) {

printf("Input an integer N: \n");
scanf("%d", N);
*M = malloc(N * sizeof(int*)); 
int i;
for (i = 0; i < N; i++)
    *(*M+i) = malloc(N * sizeof(int));
printf("Input N*N integers that will form a matrix \n");
int i, j;
for (i = 0; i < *N; i++)
    for (j = 0; j < *N; j++)
        scanf("%d", &((*M)[i][j]));
}

此代码使 **M 成为二维数组。如果我将 malloc 过程放入 main 中,则不再需要三重指针。有人可以解释一下为什么会这样吗?

【问题讨论】:

  • 它的目的是允许双指针的地址在函数内改变而不返回值(它是双指针的模拟传递引用)。成为 C 语言中的 3 星程序员 并不是一种恭维。更好的设计是将Reading 键入为int **Reading(...) 并在Reading 中声明M,分配、验证然后返回M 并分配给调用者中的双指针。

标签: c pointers


【解决方案1】:

如果我将 malloc 过程放入 main 中,则不再需要三重指针。

将变量传递给函数有两种方法:通过值或通过引用。当您传递变量的引用时,您可以对其进行修改。

例子:

void fun(int a) {
   a = 42; // Does nothing
}

int b = 9;
fun(b);
// b is unchanged.

void fun(int *a) {
   *a = 42;
}

int b = 9;
fun(&b);
// b equals 42.

您的变量恰好是int ** 类型,当您传递此变量的地址(引用)时,这使其成为int ***

【讨论】:

  • 从技术上讲,在 C 中只有 一种传递变量的方法,那就是 按值。您可以通过传递变量的地址(例如指向变量的指针)来模拟引用。
  • 我明白这一点。但是假设我们从 M 中删除了第三个指针,将 malloc 放在 main 中,并且在 Reading 函数中只保留了两个 for 循环和一个 scanf。 **M 仍然会返回修改后的只有两个星号,对吧?
猜你喜欢
  • 1970-01-01
  • 2021-10-21
  • 2011-10-01
  • 2013-08-07
  • 2019-10-23
  • 2014-10-09
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多