我目前正在尝试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)
编辑:
三者之间有很大的不同吗?
您需要根据每种情况调整您的使用情况.
第一种情况,您将两个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类型.如果你有自己的结构,那么通过指针或返回指针传递它会更有效,因为不需要创建新的副本.