W 4 dostajesz wskaźnik do pierwszego elementu tablicy. Nagłówek funkcji int funkcja(char * tab, char x); Więc masz tablicę, nie trzeba tworzyć żadnej nowej tablicy (dostajesz wskaźnik do pierwszego elementu tablicy znaków, więc jak rozumiem, ta tablica już istnieje). Do jej elementów odnosisz się tab[i]. W pętli przechodzisz po niej całej, warunek w for to: tab[i]!='\0' (bo tym jest zakończona tablica znaków). Przy wywołaniu funkcji jako parametr podajesz nazwę tablicy (która jest wskaźnikiem na pierwszy element) oraz znak, którego wystąpienia chcesz zliczać.
W 5 ponownie dostajesz wskaźnik na pierwszy element, tak samo operujesz na tablicy. W niej sprawdzasz, czy znak jest małą literą (czy jest większy lub równy 'a' i mniejszy lub równy 'z'), jeśli tak to zmieniasz ją na dużą. Możesz na przykład odjąć od niego ('a'-'A'), czyli np. tab[i]=tab[i]-('a'-'A'). Jest tak dlatego, że odległość litery dużej od małej w tabeli ASCII jest stała (równie dobrze można by odjąć ('b'-'B') ). Z dużych na małe to dodanie ('a'-'A'). Sprawdź tabelę ASCII.
W 6 nagłówek int* funkcja(int *p, int *k). Mając adres pierwszego i ostatniego elementu tablicy możesz obliczyć ilość elementów w tablicy (arytmetyka wskaźnikowa). Do znalezienia maksymalnego elementu w tablicy użyj pętli. Do pomocniczej zmiennej zapisz wartość pierwszego elementu i w pętli porównuj ją z kolejnymi, jeśli któraś jest większa to ją zapisz do zmiennej pomocniczej. Użyj też zmiennej pomocniczej do przechowywania indeksu tablicy. Na początek ustaw ją na wartość 0, a jeśli któraś wartość jest większa od tej w pierwszej zmiennej pomocniczej, to do tej drugiej zapisuj nowy indeks, odpowiadający tej wartości. Zwróć adres elementu pod tym indeksem.