Próbowałem zarówno - C
i C++
i oba działają dobrze.Wywołanie funkcji za pomocą wskaźnika funkcji - usunięcie wskaźnika, czy nie? Co za różnica?
Jestem trochę nowych do wskaźników funkcji i oto prosty kod, który mnie zaskoczył:
#include <assert.h>
void sort(int* arr, const int N);
int main()
{
int arr1[] = { 1, 5, 2, 6, 2 };
int arr2[] = { 1, 5, 2, 6, 2 };
void (*sort_ptr)(int*, const int) = sort;
sort_ptr(arr1, 5);
(*sort_ptr)(arr2, 5);
assert(arr1[0] == 1 && arr1[1] == 2 && arr1[2] == 2 &&
arr1[3] == 5 && arr1[4] == 6);
assert(arr2[0] == 1 && arr2[1] == 2 && arr2[2] == 2 &&
arr2[3] == 5 && arr2[4] == 6);
return 0;
}
void sort(int* arr, const int N)
{
// sorting the array, it's not relevant to the question
}
Więc jaka jest różnica między
sort_ptr(arr1, 5);
i
(*sort_ptr)(arr2, 5);
Oba wydają się działać (brak błędów, brak ostrzeżeń, posortowane tablice) i jestem trochę zdezorientowany. Który z nich jest prawidłowy lub oba są poprawne?
dlaczego ***** tak wielu, jak chcesz, możesz wyjaśnić? – Omkant
Wow, to naprawdę dziwne dla mnie. Dlaczego język na to pozwala? OK, nic mi nie jest z użyciem jednego '* - może to być jakieś jawne/ukryte dereferencje (jak powiedział w jego odpowiedzi @Als), ale dlaczego pozwalam na tak wiele' * '? –
Ponieważ formalnie, aby wywołać funkcję, potrzebny jest wskaźnik do funkcji, a funkcja niejawnie konwertuje wskaźnik na funkcję. Za każdym razem, gdy dodajesz '*', wynikiem jest funkcja, która konwertuje wskaźnik na funkcję, co pozwala na dalsze '*'. –