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

Podobne dokumenty