一个非常大的区别,他们真的不同 - 无论如何。
让我们保持简单:
void Function_1(int** buff)
函数 1 中的参数是一个指向名为 buff 的 int 指针的指针,该函数的作用如下:
int* retNb = null;
声明一个名为 retNb 的 int 指针,这里实际上没有必要对 NULL 赋值,因为下一行如下:
retNb = (int*) malloc(42 * sizeof(int));
调用retNb 以获取从malloc 返回的值。 malloc 在内存中分配了42*sizeof(int) 位置并将其返回给retNb,现在它可以被视为一个包含42 个整数的简单数组,并且可以用方括号[] 访问为retNb[i]。
*buff = retNb;
in pointers * 是获取变量中地址内容的方法(在本例中为变量 == 指针),因此当使用 *buff 时,buff 为 **buff(指向指针的指针)您实际上是在要求指向 buff 的指针。假设我们有代码:
int** myPointerToPointer = NULL;
int* myPointer = malloc(sizeof(int));
*myPointer = 4; //or myPointer[0] = 4;
printf("%d\n", *myPointer);
myPointerToPointer = &myPointer;
printf("%d\n", *(*myPointerToPointer));
printf("%d\n", &myPointer);
printf("%d\n", *myPointerToPointer);
那么输出将是:
4
4
SOME_ADDRESS
SAME_ADDRESS
因为第一次打印的是myPointer(4)的值,第二次是myPointerToPointer的值,它的值是myPointer,它的值是4:P
第三和第四个输出是相同的两个,因为myPointer 的地址实际上是myPointerToPointer 指向的位置。
关于第二个功能:
void Function_2(int* retNb)
它得到一个 int 指针——不是指向指针的指针——只是一个指针——意味着它包含一个整数变量的地址,可以使用操作符 * 访问。
retNb = (int*) malloc(42 * sizeof(int));
这一行正在分配动态内存(再次 42 次 sizeof(int)),现在可以被视为具有 42 个点的常规 int 数组 - 但这是它唯一做的事情,它没有任何指向它,只是分配内存,就是这样。
希望你能理解:P