Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 何时返回指针,将指针作为参数传递,还是根本不使用它们?_C_Pointers - Fatal编程技术网

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); 编辑: 这三者之间有很大区别吗

我目前正在试验C语言,我很难理解如何在函数中使用指针。我理解初始化指针然后取消引用指针时发生的情况,但是,当我必须在函数中使用它们时,我有点困惑,如下所示:

我这里有三个函数,但我不知道什么时候使用哪一个。我对C还是比较陌生的

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
    ,等等
还有一件事:通过引用传递是C++;你不能在C语言中使用它,但在你开始使用指针之前,这是一个很好的概念


传递指针基本上就是传递值。。。除了传递内存中的位置(
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
    ,等等
还有一件事:通过引用传递是C++;你不能在C语言中使用它,但在你开始使用指针之前,这是一个很好的概念


传递指针基本上就是传递值。。。除了传递内存中的位置(
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);
答案是,这取决于你想做什么。如果需要更改方法中的参数值,请通过引用或指针传递。我不建议使用最后一种方法