Ćwiczenia 9
Podstawy programowania – Wskaźniki
1. Napisz funkcję UstalLiczbeCalkowita, która zwraca jako wartość wskaźnik do zmiennej typu int.
Zadaniem funkcji jest zaalokowanie zmiennej oraz ustalenie jej wartości (wartość zmiennej wczytujemy z klawiatury).
Napisz program spradzający działanie funkcji.
2. Biorąc pod uwagę nastepujący kod:
#include<iostream>
using namespace s t d ; int main ( ) {
int a = 1 , b = 2 , c = 3 ; int ∗wsk ;
wsk = &a ;
∗wsk = a + 5 ; wsk = &b ; c = ∗wsk ∗ 2 ; ++∗wsk ;
cout << a << ” ” << b << ” ” << c << ” ” << ∗wsk << e n dl
;
return 0 ; }
• Przeanalizuj powyższy program i bez kompilacji spróbuj przewidzieć wartości wyświetlone na ekranie.
• Zwróć uwagę na sposób deklarowania zmiennej wskaźnikowej wsk.
• Operator & pojawia się dwukrotnie, czy wiesz jakie jest jego zadanie?
Przyjrzyj się proszę operatorowi dereferencji * (ten sam symbol jest
wykorzystywanyponadto jako operator mnożenia i do deklarowania zmiennych wskaźnikowych), który zamienia zmienną wskaźnikową na obiekt znajdujący się pod wskazywanym adresem.
• Skompiluj program i zobacz czy Twoje przewidywania były słuszne.
3. Biorąc pod uwagę następujący kod odpowiedz:
#include<iostream>
using namespace std ; int main ( ) {
double tablica [10] = { 1. 1 , 3 . 2 , 5 . 3 , 7 . 4 , 9 . 5 , 0 . 6 , 2 . 7 , 4 . 8 , 6 . 9 , 8 } ;
double ∗wsk ; wsk = tablica ;
cout << wsk << e n dl << wsk + 1 << e n dl ;
cout << ∗wsk << ” ” << ∗( wsk + 1 ) << e n dl << e n dl ; wsk++;
cout << wsk << e n dl << wsk + 2 << e n dl ;
cout << ∗wsk << ” ” << ∗( wsk + 2 ) << e n dl << e n dl ;
wsk += 5 ;
cout << wsk << endl << wsk − 1 << endl ;
cout << ∗wsk << ” ” << ∗( wsk − 1 ) << endl << endl ; cout << wsk − tablica ;
return 0 ; }
• Dlaczego adresy wyświetlone w pierwszych dwóch liniach nie różnią się o 1?
• Czy usunięcie nawiasu z formuły *(wsk + 1) zmienia wynik? (jaka jest kolejność wykonywania operacji?)
• Zwróć uwagę na operacje jakie możesz wykonywać na zmiennych wskaźnikowych.
• Zastanów się jakie jeszcze operacje mają sens.
4. (Zadanie z * - nie mylić z operatorem wyłuskania :-D )
Napisz program, w którym zdefiniowana jest 1-elementowa tablica typu float. Wypełnij ją liczbami od 1 do 10.
Wypisz wszystkie element tablicy na ekran nie używając operatora ‘[ ]’, który pozwala wydobywać poszczególne element z tablicy. W zamian, użyj wskaźników.
5. (Zadanie z **) Zdefiniuj funkcję
double calka (double (*fp)(double x), double a, double b, int n),
która dla danego wskaźnika do funkcji fp oblicza całkę funkcji fp na przedziale [a, b] metodą trapezów uwzględniając podział odcinka na n przedziałów. Oblicz całki kilku wybranych funkcji
Quiz 1. Co wypisze poniższy kod?
int a = 5 , ∗wsk = &a ; (∗wsk ) += 3 ;
cout << a ;
(a) 5 (b) 6 (c) 8
(d) nie skompiluje się
2. Dany jest c-string (tablica znaków zakończona znakiem ‘0’)
char *napis = ”jakis napis”;
Które z poniższych wyrażeń stanowią poprawne odwołanie do 3 elementu (litera k)?
a . n a pi s + 2 ; b . ∗ n a pi s + 2 ; c . ∗( n a pi s + 2 ) ; d . n a pi s [ 2 ] ;
3. Dana jest tablica i wskaźnik
int tab[5] = {1, 3, 5, 7, 5};
int *wsk = tab + 2;
co wypiszą następujące komendy?
a . cout << ∗wsk << e n dl ; b . cout << wsk [ 2 ] << e n dl ; c . cou << wsk[ −1] << e n dl ; d . cout << wsk – tab << e n dl ; e . cout << wsk << e n dl ;