Techniki Programowania wskaźniki 2 Łukasz Madej Katedra Informatyki Stosowanej i Modelowania Wykłady opracowane we współpracy z Danutą Szeligą, Łukaszem Sztangretem
Jeżeli wskaźnik pokazuje na element tablicy można użyć go zgodnie z notacją typową dla tablic: double tab[5] = -2,-1,0,1,2; double * ptr; ptr = &tab[0]; // lub: ptr = tab; for (int i = 0; i < 5; i++) cout << ptr[i] << ' ' << tab[i] << endl; -2,-1,0,1,2-2,-1,0,1,2
Wskaźnik taki można przesuwać po elementach tablicy: double tab[5] = -2,-1,0,1,2; ptr++; for (int i = 0; i < 4; i++) cout << *ptr << ' ' << tab[i] << endl; ptr++; -1,0,1,2-2,-1,0,1
#include<iostream> using namespace std; int main() int tab[]=0,1,2,3,4; int *wsk1,*wsk2; wsk1=&tab[1]; wsk2=&tab[4]; cout << wsk2-wsk1 << endl; 3
int main() int tab[5]=1,2,3,4,5; int *wsk; wsk=tab; for (int i=0;i<5;i++) cout<<*wsk<<"\t"<<wsk<<endl; wsk++;
Wskaźniki i const zwykły wskaźnik: stały wskaźnik int *wsk int * const wsk wskaźnik do obiektu stałego const int * wsk stały wskaźnik do stałego obiektu const int * const wsk
Stały wskaźnik #include<iostream> using namespace std; int main() int a=5,b=10; int * const w=&a; cout << *w << endl; (*w)++; cout << *w << endl; w=&b; cout << *w << endl; 5 6 błąd
Wskaźnik do obiektu stałego int main() const int a=5,b=10; const int *st_w; int *zm_w; st_w=&a; cout << *st_w << endl; st_w=&b; cout << *st_w << endl; (*st_w)++; zm_w=&a; błąd błąd
Stały wskaźnik do stałego obiektu int main() const int a=5,b=10; const int * const st_w=&a; cout << *st_w << endl; //(*st_w)++; //st_w=&b; BŁĄD BŁĄD
Dynamiczne tworzenie tablic 1D 2D 3D int *w=new int[n]; int **w = new int*[n]; for(int i=0;i<n;i++) w[i] = new int[m]; int ***w = new int**[n]; for(int i=0;i<n;i++) w[i] = new int*[m]; for(int i=0;i<n;i++) for(int j=0;j<m;j++) w[i][j] = new int[o];
Usuwanie tablic 1D 2D 3D delete [] w; for(int i=0;i<n;i++) delete [] w[i]; delete [] w; for(int i=0;i<n;i++) for(int j=0;j<m;j++) delete [] w[i][j]; for(int i=0;i<n;i++) delete [] w[i]; delete [] w;
Dynamiczne tworzenie tablic #include<iostream> using namespace std; int main() int n; cout << "Podaj rozmiar tablicy\n"; cin >> n; int *w=new int[n]; for (int i=0; i<n; i++) cout << "Podaj wartosc\n"; cin >> w[i]; for (int i=0; i<n; i++) cout << *(w+i) << endl; delete [] w;
Dynamiczne tworzenie tablic 2-D #include<iostream> using namespace std; int main() int n; cout << "Podaj rozmiar\n"; cin >> n; int **wsk=new int*[n]; for (int i=0; i<n; i++) wsk[i]=new int[n]; for (int i=0; i<n; i++) for (int j=0; j<n; j++) wsk[i][j]=i*n+j; for (int i=0; i<n; i++) for (int j=0; j<n; j++) cout<<wsk[i][j]<<"\t"; cout << endl; for(int i=0;i<n;i++) delete [] wsk[i]; delete [] wsk;
Wskaźniki w argumentach funkcji #include<iostream> using namespace std; void podwoj(int *wsk); int main() int a; cout << "Podaj liczbe\n"; cin >> a; cout << "\na = " << a << endl; podwoj(&a); cout << "a = " << a << endl; void podwoj(int *wsk) *wsk*=2; 5 10
Wskaźnik do funkcji Funkcję można wywołać lub można pobrać jej adres (miejsce, gdzie jej kod zaczyna się w pamięci). W wyniku wywołania zaczyna się wykonywać kod tej funkcji: q = fun(x, 7); W wyniku pobrania adresu funkcji uzyskuje się wskaźnik do tej funkcji: pfun = &fun; Wskaźnika tego można użyć do wywołania funkcji: q = (*pfun)(x, 7)
Wskaźnik do funkcji Definicja: funkcji fun typu T (T1, T2,...): T fun(t1, T2,...)... ; wskaźnika pf (do tej funkcji) typu T (*)(T1, T2,...): T (*pf)(t1, T2,...); int (*pf)(double, char); Ustawienie (dwa alternatywne sposoby): pf = fun; pf = &fun; Użycie (wywołanie funkcji przez wskaźnik): int res; double x; char y; res = (*pf)(x, y);
Wskaźnik do funkcji #include<iostream> using namespace std; int podwoj(int a); int potroj(int a); int main() int a, (*fun)(int a); a=10; fun=podwoj; cout << (*fun)(a) << endl; fun=potroj; cout << (*fun)(a) << endl; int podwoj(int a) return (a*2); int potroj(int a) return (a*3);
Funkcja zwracająca tablicę int *fun() static int tab[5]; for (int i=0; i<5; i++) tab[i]=i; return tab; 0 1 2 3 4 int main() int *w; w=fun(); for (int i=0; i<5; i++) cout << w[i] << endl;
Funkcja zwracająca tablicę int *fun() int *wsk=new int[5]; for (int i=0; i<5; i++) wsk[i]=i; return wsk; 0 1 2 3 4 int main() int *w; w=fun(); for (int i=0; i<5; i++) cout << w[i] << endl;
Odbieranie tablic 2-D od funkcji #include<iostream> using namespace std; int **tworz(int n); int main() int **t, n; cout << "Podaj rozmiar macierzy\n"; cin >> n; t=tworz(n); for (int i=0; i<n; i++) for (int j=0; j<n; j++) cout << *(*(t+i)+j) << "\t"; //lub cout<<t[i][j]<<endl; cout << endl; int **tworz(int n) int **wsk=new int*[n]; for (int i=0; i<n; i++) wsk[i]=new int[n]; for (int i=0; i<n; i++) for (int j=0; j<n; j++) wsk[i][j]=i*n+j; return wsk;
Argumenty z linii wywołania programu #include<iostream> using namespace std; int main(int argc, char *argv[]) cout<<"dostalem parametrow: "<<argc<<endl<<endl; for (int i=0; i<argc; i++) cout<<i<<" parametr to\t"<<argv[i]<<endl; funkcja info 3.4 45.9 4 funkcja info 3.4 45.9
Argumenty z linii wywołania programu #include<iostream> #include<cstdlib> using namespace std; int main(int argc, char *argv[]) cout<<argv[2]<<"+"<<argv[3]<<"="; cout<<atof(argv[2])+atof(argv[4])<<endl; funkcja info 3.4 45.9 3.4 + 45.9 = 49.3
Czytanie deklaracji 1. Zaczynamy od nazwy. 2. Następnie poruszamy się w prawo. 3. Gdy napotkamy na nawias zamykający poruszamy się w lewo. 4. Jeżeli odczytaliśmy już wszystko w obrębie danego nawiasu wychodzimy na zewnątrz i znowu poruszamy się w prawo.
Co to jest a??? 1. int *(*(*a)(int))[10]; 2. int (*(*a())[10])(); 3. float (*(*a)(int))(double); 4. double (*(*(*a)())[10])();