8  Wskaźniki

Zadania należy rozwiązać bez interpretacji wskaźników jako tablic.

  1. Skopiuj lub przepisz kod i sprawdź wyniki na standardowym wyjściu:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("%zu\n", sizeof(int));
    printf("%zu\n", sizeof(int*));
    return 0;
}
  1. W jednym pliku wykonaj czynności:
  1. Napisz funkcję copyInt z argumentami: x typu int oraz w, który jest wskaźnikiem do int. Funkcja ma przepisać wartość x do zmiennej wskazywanej przez w. Stwórz przypadek testowy.

  2. Napisz funkcję findMax z dwoma argumentami: wskaźnikiem num1 na stałą wartość typu double i stałym wskaźnikiem num2 na zmienną typu double. Funkcja ma zwracać większą wartość spośród tych, na które wskazują num1 i num2. Utwórz przypadek testowy.

  3. Napisz funkcję initInts, która nie przyjmuje argumentów i rezerwuje blok trzech zmiennych typu int, ustawiając ich wartości kolejno na 5, -12, 33. Funkcja zwraca wskaźnik na środkową zmienną. Utwórz przypadek testowy w funkcji main, który wyświetla wartości z bloku stworzonego przez funkcję.

  4. Napisz funkcję initFloats, która nie przyjmuje argumentów i rezerwuje blok trzech zmiennych typu float, ustawiając ich wartości kolejno na 4.5, 2.3, -4.2. Funkcja zwraca wskaźnik na początkową ze zmiennych w bloku. Utwórz przypadek testowy w funkcji main, który wyświetla wartości z bloku stworzonego przez funkcję.

  5. Napisz funkcję initFlts, która nie przyjmuje argumentów i rezerwuje blok czterech zmiennych typu float, ustawiając ich wartości kolejno na 0.5, 1.5, 2.5, i 3.5. Funkcja zwraca wskaźnik na ostatnią zmienną w bloku. Utwórz przypadek testowy w main, aby wyświetlić wartości z bloku stworzonego przez funkcję.

  6. Napisz funkcję sumToPtr z trzema argumentami: dwoma wskaźnikami na stałe typu int i wskaźnikiem na zmienną typu int. Funkcja ma przepisać do zmiennej wskazywanej przez trzeci argument sumę wartości stałych wskazywanych przez pierwszy i drugi argument. Utwórz przypadek testowy.

  7. Napisz funkcję sqrCopy z dwoma argumentami: wskaźnikiem na stałą typu int i wskaźnikiem na zmienną typu int. Funkcja ma przepisać kwadrat wartości stałej do zmiennej wskazywanej przez drugi argument. Utwórz przypadek testowy.

  8. Napisz funkcję subPtrs z dwoma argumentami: wskaźnikiem num1 na stałą wartość typu double i stałym wskaźnikiem num2 na zmienną typu double. Funkcja ma zwracać różnicę wartości, na które wskazują num1 i num2. Utwórz przypadek testowy.

  9. Napisz funkcję sumSqrs z dwoma argumentami: wskaźnikiem num1 na stałą wartość typu int i stałym wskaźnikiem num2 na zmienną typu int. Funkcja ma zwracać sumę kwadratów wartości wskazywanych przez num1 i num2. Utwórz przypadek testowy.

  10. Napisz funkcję linFuncVal z trzema argumentami: wskaźnikiem a na stałą wartość typu float, stałym wskaźnikiem b na zmienną typu float, i wskaźnikiem x na stałą wartość typu float. Funkcja ma obliczać i zwracać wartość funkcji liniowej y=ax+b dla argumentu x, gdzie a i b są wskazywane przez odpowiednie wskaźniki. Utwórz przypadek testowy.

  11. Napisz funkcję minPtr z trzema argumentami, które są wskaźnikami na zmienne typu int. Funkcja zwraca wskaźnik na zmienną o najmniejszej wartości spośród tych, na które wskazują argumenty. Utwórz przypadek testowy w main, aby wyświetlić najmniejszą wartość spośród trzech zmiennych.

  12. Napisz funkcję multPtrs z dwoma argumentami: wskaźnikiem num1 na stałą wartość typu double i stałym wskaźnikiem num2 na zmienną typu double. Funkcja zwraca iloczyn wartości wskazywanych przez te wskaźniki. Utwórz przypadek testowy.

  13. Napisz funkcję absVal z jednym argumentem, którym jest wskaźnik na zmienną typu int. Funkcja oblicza wartość bezwzględną zmiennej wskazywanej przez wskaźnik i aktualizuje tę zmienną. Utwórz przypadek testowy w main, aby wyświetlić wartość zaktualizowanej zmiennej.

  14. Napisz funkcję swap z dwoma argumentami: wskaźnikiem ptr1 na zmienną typu int i wskaźnikiem ptr2 na inną zmienną tego samego typu. Funkcja zamienia miejscami wartości wskazywane przez wskaźniki. Utwórz przypadek testowy.

  15. Napisz funkcję swapSign z dwoma argumentami: wskaźnikiem ptr1 na zmienną typu double i wskaźnikiem ptr2 na inną zmienną tego samego typu. Funkcja zamienia miejscami wartości wskazywane przez wskaźniki, jeśli mają one różne znaki. W przeciwnym razie nie robi nic. Utwórz przypadek testowy.

  16. Napisz funkcję swapIfGreater, która ma dwa argumenty. Pierwszym argumentem jest wskaźnik ptr1 na zmienną typu int, a drugim argumentem jest wskaźnik ptr2 na zmienną typu int. Funkcja ma zamienić wartości wskazywane przez te wskaźniki miejscami, ale tylko wtedy, gdy wartość wskazywana przez pierwszy wskaźnik jest większa od wartości wskazywanej przez drugi wskaźnik. Funkcja nie zwraca żadnej wartości. Stwórz przypadek testowy dla funkcji.

  17. Napisz funkcję swapMaxMiddle, która przyjmuje jako argumenty trzy wskaźniki na zmienne typu int. Funkcja powinna zamienić miejscami wartości największej i środkowej (pod względem wartości w porządku niemalejącym) ze zmiennych wskazywanych przez wskaźniki. Stwórz przypadek testowy w main tak, aby wyświetlić na konsoli wartości zmiennych przed i po zamianie.

  18. Napisz funkcję swapFirstPositive, która przyjmuje jako argumenty trzy wskaźniki na zmienne typu int. Funkcja powinna zamienić miejscami wartości początkowej i pierwszej dodatniej ze zmiennych wskazywanych przez wskaźniki. Jeśli nie ma zmiennej dodatniej, funkcja nie powinna dokonywać żadnych zmian. Stwórz przypadek testowy w main tak, aby wyświetlić na konsoli wartości zmiennych przed i po zamianie.

  19. Napisz funkcję swapOddEven, która przyjmuje jako argumenty cztery wskaźniki na zmienne typu int. Funkcja powinna zamienić miejscami wartości zmiennych tak, aby wszystkie parzyste wartości były na początku, a nieparzyste na końcu (kolejność wewnątrz grup nie ma znaczenia). Stwórz przypadek testowy w main tak, aby wyświetlić na konsoli wartości zmiennych przed i po zamianie.

  20. Napisz funkcję modifyThroughPtr z dwoma argumentami: wskaźnikiem na zmienną typu int oraz wartością typu int. Funkcja ma wykonać następujące operacje: jeśli wartość druga jest dodatnia — zwiększyć wartość zmiennej wskazywanej przez pierwszy argument o tę wartość; jeśli druga wartość jest ujemna — zmniejszyć wartość pierwszej zmiennej o wartość bezwzględną drugiego argumentu; a jeśli druga wartość wynosi 0 — nie zmieniać wartości. Funkcja zwraca adres zmodyfikowanej zmiennej. Utwórz przypadek testowy.