Получение проблемы с указателем в программе C - PullRequest
1 голос
/ 26 февраля 2020

Поскольку мы знаем, что массивы передаются указателями только в C, тогда swap1(arr[i],arr[j]) ниже означает, что два указателя будут переданы функции swap1(), тогда почему swap1(arr[i],arr[j]) дает мне ошибку? В соответствии с прототипом функции swap1() необходимо передать два указателя, и я передаю это.

С другой стороны, когда я передаю адрес swap1(&arr[i],&arr[j]), он работает нормально, что очевидно.

void swap1(int *a,int *b){
   int temp = *a;
   *a = *b;
   *b = temp;
}
void bubble(int arr[], int i, int n)
{
    for(int j=i+1;j<n;j++){
        if(arr[i]>arr[j])
        swap1(arr[i],arr[j]);
    }
}

Ответы [ 3 ]

2 голосов
/ 26 февраля 2020

В функции bubble переменная arr является указателем (тип int *). Это означает, что arr[i] (для любого i) - это , а не указатель, это int значение .

Когда вы передаете эти значения int на swap компилятор должен пожаловаться на это, и это правильно, потому что функция swap ожидает указатели (опять же типа int *).

Чтобы получить указатель на arr[i], вам нужно использовать адрес оператора &, как в &arr[i]:

swap1(&arr[i], &arr[j]);
0 голосов
/ 26 февраля 2020

Из стандарта C (6.5.2.1 подписка на массив)

2 Постфиксное выражение, за которым следует выражение в квадратных скобках [], является индексным обозначением элемента объекта массива. Определение оператора индекса [] заключается в том, что E1 [E2] идентична (* ((E1) + (E2))). Из-за правил преобразования, которые применяются к бинарному оператору +, если E1 является объектом массива (эквивалентно указателю на начальный элемент объекта массива), а E2 является целым числом, E1 [E2] обозначает E2- th-й элемент E1 (считая с нуля).

Поэтому при вызове функции, подобной

swap1(arr[i],arr[j]);

, вы передаете значения двух элементов массива , Чтобы передать указатели на эти элементы, вы можете написать

swap1( arr + i, arr + j );

Разница будет очевидна, если первый вызов переписать, как написано в цитате из C Standard

swap1(arr[i],arr[j]);

эквивалентно

swap1( *( arr + i ), *( arr +j ) );

, то есть указатели разыменовываются перед передачей управления функции.

0 голосов
/ 26 февраля 2020

, когда arr - массив, действительно, передача arr фактически передает указатель на первый элемент. однако, когда вы используете оператор задержки [i], вы передаете значение элемента i-th, а не его адрес.

...