Tablice i wskazniki
Transkrypt
Tablice i wskazniki
Tablice i wska¹niki Elwira Wachowicz [email protected] 13/06/2011 Elwira Wachowicz Tablice i wska¹niki Wska¹niki Wska¹nik: zmienna, której warto±¢ jest adresem w pami¦ci. wsk = &ach; Mówimy: wsk /* przypisuje zmiennej wsk adrese zmiennej ach */ wskazuje na ach Elwira Wachowicz Tablice i wska¹niki Operator dereferencji (po±rednio±ci): * wsk = &ach; wart = *wsk; /* przypisuje zmiennej wsk adrese zmiennej ach */ /* znajduje warto±¢, na któr¡ wskazuje wsk */ Powy»sze dwie instrukcje s¡ równowa»ne: wart = ach; Elwira Wachowicz Tablice i wska¹niki Deklarowanie wska¹ników Prawidªowa deklaracja wska¹nika: int * pi; /* pi jest wska¹nikiem do zmiennej caªkowitej */ char * pc; /* pc jest wska¹nikiem do zmiennej znakowej */ float * pf, * pq; /* pf i pg s¡ wska¹nikami do zmiennej typu float */ Elwira Wachowicz Tablice i wska¹niki /* zamien.c -- zamiana z wykorzystaniem wska¹ników */ #include <stdio.h> void zamiana(int * u, int * v); int main(void) { int x = 5, y = 10; printf("Pocz¡tkowo x = %d, a y = %d.\n", x, y); zamiana(&x, &y); /* wysyªanie adresów do funkcji */ printf("A teraz x = %d, a y = %d.\n", x, y); return 0; } void zamiana(int * u, int * v) { int temp; } temp = *u; /* temp otrzymuje warto±¢, na któr¡ wskazuje u */ *u = *v; *v = temp; Dostajemy: Pocz¡tkowo x = 5, a y = 10. A teraz x = 10, a y = 5. Elwira Wachowicz Tablice i wska¹niki Operatory zwi¡zane ze wska¹nikami podsumowanie Operator adresu &: pozwala uzyska¢ adres zmiennej, której nazwa po nim wyst¦puje. Przykªad: &siostra jest adresem zmiennej siostra. Operator deferencji *: zwraca warto±¢ przechowywan¡ pod adresem wskazanym przez zmienn¡ wska¹nikow¡. Przykªad: siostra = 22; wsk = &siostra; wart = * wsk; Elwira Wachowicz Tablice i wska¹niki /* wsk_dod.c -- dodawanie do wska¹ników */ #include <stdio.h> #define ROZMIAR 4 int main(void) { short daty[ROZMIAR], * ptc, index; double oplaty[ROZMIAR], * ptz; } ptc = daty; /* przypisuje adres tablicy wska¹nikowej */ ptz = oplaty; printf("%25s %10s\n", "short", "double"); for (index = 0; index < ROZMIAR; index++) printf("wska¹niki + %d: %10p %10p\n", index, ptc + index, ptz + index); return 0; Dostajemy: wska¹niki wska¹niki wska¹niki wska¹niki + + + + 0: 1: 2: 3: short 0x7fff1f922f40 0x7fff1f922f42 0x7fff1f922f44 0x7fff1f922f46 double 0x7fff1f922f20 0x7fff1f922f28 0x7fff1f922f30 0x7fff1f922f38 Elwira Wachowicz Tablice i wska¹niki wska¹niki wska¹niki wska¹niki wska¹niki + + + + 0: 1: 2: 3: short 0x7fff1f922f40 0x7fff1f922f42 0x7fff1f922f44 0x7fff1f922f46 double 0x7fff1f922f20 0x7fff1f922f28 0x7fff1f922f30 0x7fff1f922f38 Elwira Wachowicz Tablice i wska¹niki Wska¹niki do tablic Nazwa tablicy jest zarazem adresem jej pierwszego elementu: domek == &domek[0] Warto±ci¡ wska¹nika jest adres wskazywanego elementu sposób reprezentacji zale»y od platformy sprz¦towej. PC: adresowanie bajtowe. Adres du»ego obiektu, to adres pierwszego bajtu. Zastosowanie do wska¹nika operatora *, daje warto±¢ wskazywanego obiektu. Dodanie 1 do wska¹nika zwi¦ksza jego warto±¢ o rozmiar (w bajtach) wskazywanego obiektu. daty + 2 == &daty[2] /* ten sam adres */ *(daty + 2) == daty[2] /* ta sama warto±¢ */ *daty + 2 /* 2 dodane do warto±ci 1. elementu */ Elwira Wachowicz Tablice i wska¹niki /* dni_m.c -- wykorzystuje zapis wska¹nikowy */ #include <stdio.h> #define MIESIACE 12 int main(void) { int dni[MIESIACE] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int index; } for (index = 0; index < MIESIACE; index++) printf("Miesi¡c %d ma %d dni.\n", index + 1, *(dni + index)); // równowa»ne dni(index) return 0; Elwira Wachowicz Tablice i wska¹niki Tablice wielowymiarowe int M[4][5] dwuwymiarowa macierz zmiennych caªkowitych o 4 wierszach i 5 kolumnach. Inicjalizacja tablicy dwuwymiarowej: int M[4][5] = { }; {10, { 9, {32, { 0, 5, 0, 20, 0, -3, 17, 82}, 0, 8, -7}, 1, 0, 14}, 8, 7, 6} int M[4][5] = { 10, 5, -3, 17, 82, 9, 0, 0, 8, -7, 32, 20, 1, 0, 14, 0, 0, 8, 7, 6}; int macierz[4][3] = { [0][0] = 1, [1][1] = 5, [2][2] = 9}; Macierz trójwymiarowa: int pudelko[10][20][30]; Elwira Wachowicz Tablice i wska¹niki /* podwtab.c -- podwaja elementy tablicy */ #include <stdio.h> void podwoj(int tab[], int rozmiar); int main(void) { int smieci[3][4] = { {2, 4, 5, 8}, {3, 5, 6, 9}, {12, 10, 8, 6} }; int i, j; \begin{columns} for(i = 0; i < 3; i++) podwoj(smieci[i], 4); 4 6 24 for(i = 0; i < 3; i++) { for(j = 0; j < 4; j++) printf("%5d", smieci[i][j]); putchar('\n'); } return 0; } void podwoj(int tab[], int rozmiar) { int i; } /* lub int * tab */ for(i = 0; i < rozmiar; i++) tab[i] *= 2; Elwira Wachowicz Tablice i wska¹niki 8 10 20 10 12 16 16 18 12