Передача указателя по ссылке в C - PullRequest
1 голос
/ 28 марта 2019

Довольно плохо знаком с кодированием 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 ]

4 голосов
/ 28 марта 2019

В C передача по ссылке эмулируется путем передачи указателя на нужный тип. Это означает, что если у вас есть int *, который вы хотите передать функции, которую можно изменить (то есть изменение в int * видно в вызывающей программе), то функция должна принять int **.

В вашем конкретном случае, однако, это не то, что вы хотите. Вам нужно только передать int * вашей функции, которую он затем может неявно разыменовать с помощью оператора [] и изменить элементы массива.

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;
        }
    }
  } 
}
1 голос
/ 28 марта 2019

В 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...