C 何时返回指针,将指针作为参数传递,还是根本不使用它们?
我目前正在试验C语言,我很难理解如何在函数中使用指针。我理解初始化指针然后取消引用指针时发生的情况,但是,当我必须在函数中使用它们时,我有点困惑,如下所示: 我这里有三个函数,但我不知道什么时候使用哪一个。我对C还是比较陌生的C 何时返回指针,将指针作为参数传递,还是根本不使用它们?,c,pointers,C,Pointers,我目前正在试验C语言,我很难理解如何在函数中使用指针。我理解初始化指针然后取消引用指针时发生的情况,但是,当我必须在函数中使用它们时,我有点困惑,如下所示: 我这里有三个函数,但我不知道什么时候使用哪一个。我对C还是比较陌生的 int returnSomething(int a, int b) int returnSomething(int *ptrA, int *ptrB) int* returnSomething(int *ptrA, int *ptrB); 编辑: 这三者之间有很大区别吗
int returnSomething(int a, int b)
int returnSomething(int *ptrA, int *ptrB)
int* returnSomething(int *ptrA, int *ptrB);
编辑:
这三者之间有很大区别吗?让我们先向您解释一下通过引用传递的;处理起来就不那么复杂了 假设你有:
int increment(int &a)
{
a = a + 1;
return a;
}
increment(foo); // foo = foo + 1;
(注意:为了更容易理解,我牺牲了一些“正确性”。)
这有两个作用:
- 第三行将
增加a
。但是请注意,我们在函数声明中添加了1
。这意味着“通过引用”传递给&a
的值也会增加increment()
。换句话说,1
增加foo
,就像1
一样a
- 第四行返回
-一个数字的值,例如a
,1
,2
,42
,等等-21
传递指针基本上就是传递值。。。除了传递内存中的位置(
0x12345678
),而不是实际的foo
int pincrement(int *p)
{
*p = *p + 1;
return *p;
}
pincrement(&foo); // foo = foo + 1;
这与我们的第一个程序的作用相同-它增加foo
的值
int pincrement(int *p)
{
*p = *p + 1;
return *p;
}
pincrement(&foo); // foo = foo + 1;
告诉您内存中&foo
的地址。此信息将传递到foo
。因此:p
p = &foo;
- 在第三行,由
指向的值递增。换句话说,*p
增加foo
1
- 第四行返回
-一个数字的值,例如foo
,1
,2
,42
,等等-21
对于返回指针,可以使用它们返回
string
s:
char *HelloWorld()
{
return "Hello, World!";
}
让我们先向您解释一下通过引用传递;处理起来就不那么复杂了 假设你有:
int increment(int &a)
{
a = a + 1;
return a;
}
increment(foo); // foo = foo + 1;
(注意:为了更容易理解,我牺牲了一些“正确性”。)
这有两个作用:
- 第三行将
增加a
。但是请注意,我们在函数声明中添加了1
。这意味着“通过引用”传递给&a
的值也会增加increment()
。换句话说,1
增加foo
,就像1
一样a
- 第四行返回
-一个数字的值,例如a
,1
,2
,42
,等等-21
传递指针基本上就是传递值。。。除了传递内存中的位置(
0x12345678
),而不是实际的foo
int pincrement(int *p)
{
*p = *p + 1;
return *p;
}
pincrement(&foo); // foo = foo + 1;
这与我们的第一个程序的作用相同-它增加foo
的值
int pincrement(int *p)
{
*p = *p + 1;
return *p;
}
pincrement(&foo); // foo = foo + 1;
告诉您内存中&foo
的地址。此信息将传递到foo
。因此:p
p = &foo;
- 在第三行,由
指向的值递增。换句话说,*p
增加foo
1
- 第四行返回
-一个数字的值,例如foo
,1
,2
,42
,等等-21
对于返回指针,可以使用它们返回
string
s:
char *HelloWorld()
{
return "Hello, World!";
}
您需要根据各种情况调整您的用法 在第一种情况下,将两个int by value作为参数并返回一个int。因为您的参数是by value,所以应用于它们的任何更改将只具有函数范围 例如:
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
在第二种情况下,由于将参数作为指针传递,因此可以更改值
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
第三种情况,除了通过指针传递参数外,还可以返回一个指向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);
答案是,这取决于你想做什么。如果需要更改方法中的参数值,请通过引用或指针传递。我不建议使用最后一种方法
此外,这也适用,因为您正在处理POD类型。如果您有自己的结构,则通过指针传递或返回指针将更有效,因为不必制作新的副本。您需要根据各种情况调整使用方法 在第一种情况下,将两个int by value作为参数并返回一个int。因为您的参数是by value,所以应用于它们的任何更改将只具有函数范围 例如:
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
在第二种情况下,由于将参数作为指针传递,因此可以更改值
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
第三种情况,除了通过指针传递参数外,还可以返回一个指向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);
答案是,这取决于你想做什么。如果需要更改方法中的参数值,请通过引用或指针传递。我不建议使用最后一种方法