在C中通过引用传递指针

时间:2019-03-28 15:13:36

标签: c

具有c ++背景知识的c编码的新手。我有一个简单的程序,使用函数对数组进行排序。我需要通过引用将int指针传递给sort()函数,以便编译器不会创建副本,并且在函数调用后将对数组进行排序。如果我不传递引用,则函数结束后,数组将保持未排序状态。

#include <stdio.h>
#include <stdlib.h>

void sort(int* & arr, int s, int e)
{
  int temp = 0, i, j;
  for (i=0;i<e;i++)
  {
    for (j=i+1;j<e;j++)
    {
        if (*arr[i]>*arr[j])
        {
            temp = *arr[i];
            *arr[i] = *arr[j];
            *arr[j] = temp;
        }
    }
  } 
}

int main()
{   
    int* arr = malloc(sizeof(int)*10);
    int i;

     for (i=0;i<10;i++)
         arr[i] = i+1;
     printf("Array before sorting:\n");
     for (i=0;i<10;i++)
         printf("%d  ", arr[i]);
     printf("\n");

     sort(arr, 0, 10);
     printf("Array after sorting:\n");
     for (i=0;i<10;i++)
         printf("%d  ", arr[i]);
     printf("\n");

     return 0;
}

我还知道c不允许在函数中进行引用传递,那么如何解决此问题?

2 个答案:

答案 0 :(得分:4)

在C语言中,通过传递指向所需类型的指针来模拟按引用传递。这意味着如果您有一个int *要传递给可以修改的函数(即,在调用方中可以看到对int *的更改),则该函数应接受一个{{1 }}。

但是,在您的特定情况下,这不是您想要的。您只需要将int **传递给函数,然后它就可以通过int *运算符隐式取消引用并更改数组的元素。

[]

答案 1 :(得分:1)

在C语言中没有引用。

将指针传递给函数将不会复制该指针指向的对象。

void foo(int* array);

然后可以通过延迟指针访问元素。

int a = *array; //dereferencing the pointer. Getting the first element.
int b = array[0]; // does the same thing.
int c = *(array + 1) // second element. Pointer shifts by 1 * sizeof(type) bytes
int d = array[1] // second element again

传递这样的指针与传递带有字长的整数(因为指针只是其下的整数)具有相同的开销。

如果要将指针传递给数组,则应将其作为双指针**传递。由于您可以在函数中更改指针,因此几乎可以用作传递它的引用。
用例:

void foo(int** array) // passing a double pointer
{
    //....
    *array = theNewCollection;
    //...
}

调用此函数的方式应为

int* arr = malloc(sizeof(int)*10);
foo(&arr);