C语言中三重指针的用途

C语言中三重指针的用途,c,pointers,C,Pointers,虽然我看到了一些关于这方面的线索,但我无法理解三个指针背后的含义,因为似乎没有它们也可以做到同样的事情 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("I

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

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]));
}
无效读取(int*N,int***M){
printf(“输入一个整数N:\N”);
scanf(“%d”,N);
*M=malloc(N*sizeof(int*);
int i;
对于(i=0;i
此代码使**M成为二维数组。如果我把malloc过程放到main中,就不再需要三重指针了。有人能解释一下为什么会这样吗

如果我把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语言的三星级程序员并不是一种恭维。更好的设计是将
Reading
键入为
int**Reading(…)
并在
Reading
中声明
M
,分配、验证,然后返回
M
,并分配给调用程序中的双指针。从技术上讲,在C中,传递变量的方法只有一种,即通过值传递。您可以通过传递变量的地址(例如指向变量的指针)来模拟引用。我理解这一点。但是假设我们从M中删除第三个指针,将mallocs放在main中,在Reading函数中只留下两个for循环和一个scanf。**M仍将返回只有两个星号的修改,对吗?