何时返回指针,将指针作为参数传递或者根本不使用它们?

die*_*sel 0 c pointers

我目前正在尝试C,我很难理解如何在函数中使用指针.我理解当我初始化指针然后取消引用它时发生了什么,但是,当我必须在函数中使用它们时,我有点困惑,如下所示:

我这里有三个功能,但我不确切知道何时使用哪个功能.我还是比较新的C.

int returnSomething(int a, int b)
int returnSomething(int *ptrA, int *ptrB)
int* returnSomething(int *ptrA, int *ptrB);
Run Code Online (Sandbox Code Playgroud)

编辑:

三者之间有很大的不同吗?

Luc*_*ore 6

您需要根据每种情况调整您的使用情况.

第一种情况,您将两个int作为参数并返回一个int.因为您的参数是按值的,所以应用于它们的任何更改都只有函数范围.

例如:

int returnSomething(int a, int b)
{
    a = 0;
    b = 0;
    return 0;
}

//....

int x = 3;
int y = 4;
returnSomething(a,b);
// x will still be 3, y will still be 4
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,因为您将参数作为指针传递,所以您将能够更改这些值.

int returnSomething(int* a, int* b)
{
    *a = 0;
    *b = 0;
    return 0;
}

//....

int x = 3;
int y = 4;
returnSomething(&a,&b);
// x and y will be 0 here
Run Code Online (Sandbox Code Playgroud)

第三种情况,除了通过指针传递参数外,还返回指向int的指针.这意味着在函数内部,您必须分配内存并在完成后释放它.我不建议使用它,通常有解决方法来执行此操作.

int* returnSomething(int* a, int* b)
{
   int* x = malloc(sizeof(int));
   *x = 1;
   return x;
}

//....

int x = 3;
int y = 4;
int* z = returnSomething(&a,&b);
free(z);
Run Code Online (Sandbox Code Playgroud)

答案是,这取决于你想做什么.如果需要更改方法中的参数值,请按引用或通过指针进行传递.我不建议使用最后一种方法.

此外,这适用于您正在处理POD类型.如果你有自己的结构,那么通过指针或返回指针传递它会更有效,因为不需要创建新的副本.