我总是看到两种函数,如下所示:

void Function_1(
    int** buff
    )
{
    int* retNb = null;
    retNb = (int*) malloc(42 * sizeof(int));
    *buff = retNb;
}

void Function_2(
    int* retNb
    )
{
    retNb = (int*) malloc(42 * sizeof(int));
}


function_1function_2有什么区别?他们的用例是什么?

最佳答案

确实有很大的不同,它们确实有所不同-无论如何。
让我们保持简单:

 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;


在指针*中是获取变量中地址内容的方式(在这种情况下为变量==指针),因此当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

关于c - C,两种功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24248491/

10-11 01:35