Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

OSNOVA: a) Ukazatel b) Pole a ukazatel c) Pole ukazatelů d) Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 1 pro.

Podobné prezentace


Prezentace na téma: "OSNOVA: a) Ukazatel b) Pole a ukazatel c) Pole ukazatelů d) Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 1 pro."— Transkript prezentace:

1 OSNOVA: a) Ukazatel b) Pole a ukazatel c) Pole ukazatelů d) Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 1 pro obor EST BPC1E PŘEDNÁŠKA 6

2 Ukazatel (1/10) Ukazatel (pointer) je datový typ sloužící k uložení adresy v paměti počítače Požadovaná velikost pro uložení ukazatele v paměti (počet bytů) je dána paměťovým prostorem, který daný počítačový systém využívá Pro malé mikrokontrolé- rové aplikace je ukazatel obvykle 16ti bitový (2 B) s adresací paměťového prostoru do 64 kB (adresa hexadecimálně 0x0000 až 0xFFFF)

3 Pokud je fyzický paměťový prostor větší, používá se segmentace – velký pamě- ťový prostor je rozdělen na segmenty (stránky) o veli- kosti 64 kB a ukazatel definuje adresu na dané stránce, tzv. blízký ukazatel, nebo je použit tzv. vzdálený ukazatel, který obsahuje i identifikaci příslušné pamě- ťové stránky a adresu (off- set) v rámci dané stránky Ukazatel (2/10)

4 U 32 bitových systémů se používá 32 bitový ukazatel, tj. 4 B a adresy v hexadecimálním rozsahu 0x do 0xFFFFFFFF, celkem 4 GB U 64 bitových systémů se používá 64 bitový ukazatel, tj. 8 B, celkem 16 HB (hexabytů) Pozn. 1 kB = 2 10 B = 1024 B 1 MB = 2 20 B = 1024 kB = B 1 GB = 2 30 B = 1024 MB, 1 TB = 2 40 B = 1024 GB 1 PB = 2 50 B = 1024 TB, 1 HB = 2 60 B = 1024 HB, atd. Ukazatel (3/10)

5 Ukazatelová aritmetika (Pointer aritmetics) zahrnuje výpočetní operace nad ukazateli. Adresovatelnou jednotkou může být 1 byte, 1 slovo (2 B), v jazyce C velikost datového typu (char = 1B, int = 4B, …), jenž ukazatel adresuje. int *a, *b; //pointers to integer int x; int y[5] = {1, 2, 3, 4, 5}; a = &x; //pointer a contents address of variable x *a = y[2]; //fill address defined by a by y[2], x=y[2] printf("%d\n", x); b = &(y[3]); //pointer b contents address of var. y[3] *b = *a; //content of address pointed by a is copied to content of address pointed by b printf("%d\n", y[3]); Příklad: BPC1E_Ex42.c Ukazatel (4/10)

6 Prvky jednorozměrného pole jsou v paměti řazeny za sebou, indexovat (ukázat na x -tý prvek) pole lze pomocí ukazatelů. int *adr; //pointer to integer int arr[50], i; adr = &(arr[49]);//pointer is set to the last element for(i=0; i<50; i++) { *adr = i;//a number is paste to the address //defined by pointer adr adr--;//pointer is shifted down (-1 element //of arr = -4 bytes due to int type } for(i=0; i<50; i++) printf("%d\n", arr[i]); Příklad: BPC1E_Ex43.c Ukazatel (5/10)

7 Jméno pole bez indexu je ukazatelem na první prvek pole: zápis A[0] je ekvivalentní *A zápis A[5] je ekvivalentní *(A+5) int *adr; //pointer to integer int arr[50], i; adr = arr;//pointer is set to the first element for(i=0; i<50; i++) { *adr = i;//a number is paste to the address //defined by pointer adr adr++;//pointer is shifted up (+1 element //of arr = +4 bytes due to int type } for(i=0; i<50; i++) printf("%d\n", arr[i]); Příklad: BPC1E_Ex44.c Ukazatel (6/10)

8 Př. Aplikace relačních operátorů na ukazatele int *a, *b, *c; // pointers to integer int arr[20], i; a = arr; for(i=0; i<20; i++) {*a = i; a++;} for(i=0; i<20; i++) printf("%3d", arr[i]); b = arr+5; c = arr+15; a = arr; for(i=0; i<20; i++) { if (b a) //address a must be between b and c *a=0; a++; } for(i=0; i<20; i++) printf("%3d", arr[i]); Příklad: BPC1E_Ex45.c Ukazatel (7/10)

9 Př. Integer v paměti po bytech int *a; //pointer to int char *b; //pointer to char int arr[5], i; for(i=0; i<5; i++) arr[i] = i; a=arr; for(i=0; i<5; i++) //int address and value displaying { printf("%x %3d\n", a, *a); a++; } b=arr; for(i=0; i<20; i++) //char (byte) addr. and value disp. { printf("%x %3d\n", b, *b); b++; } Příklad: BPC1E_Ex46.c Ukazatel (8/10)

10 Př. Float v paměti po bytech unsigned char *a; //pointer to uchar float num = 1.2; //float value in memory int i; a=# for(i=0; i<4; i++) //four bytes of float value in mem. { printf("%x ", a);//address printf("%x\n", *a);//content a++; } Příklad: BPC1E_Ex47.c Pro hodnotu 1,2 uloženou jako typ float je v paměti uloženo (hexa) 9A F, uspořádání je od nejméně významného bytu pro nejvíce významný Ukazatel (9/10)

11 1,2 ve float rozlišení má tedy tvar hexa: 0x 3 F A binárně: 0b znaménko: 0 = + exponent: 0b = 127 mantisa: 0b = Ukazatel (10/10)

12 int *a; //pointer to int int arr[4][5], i, j; for(i=0; i<4; i++) { for(j=0; j<5; j++) { arr[i][j]= 10*i+j;v printf("%3d", arr[i][j]); } printf("\n"); } a=arr; for(i=0; i<20; i++, a++) //20 elements of array in mem printf("%x %3d\n", a, *a); //printing Příklad: BPC1E_Ex48.c Dvourozměrné pole v paměti Pole a ukazatel (1/3)

13 Vícerozměrné pole v paměti int *a; //pointer to int int arr[3][3][3], i, j, k; for(i=0; i<3; i++) for(j=0; j<3; j++) for(k=0; k<3; k++) arr[i][j][k] = 100*i + 10*j + k; for(i=0; i<27; i++, a++) //27 elements of array 3x3x3 printf("%x %3d\n", a, *a); //in memory printing Příklad: BPC1E_Ex49.c Pole a ukazatel (2/3)

14 Vícerozměrné pole a ukládání jeho prvků v paměti: Ekvivalentní zápis: arr[i][j][k] = *(arr+i*3*3+j*3+k) Pole a ukazatel (3/3)

15 Pole ukazatelů (1/2) Př. Aplikace pole ukazatelů – vyhledání pozic znaků v textu char text[] = "okolo kola okolkovala koala"; char *o[10], *c; //o is array of pointers int i=0, j; printf("Original string: %s\n\n", text); printf("Addr. of the beginning of text: %x\n\n", text); o[i] = strchr(text, 'o'); while(o[i]) { c = o[i]+1; i++; o[i] = strchr(c, 'o'); //save addres of ’o’ to //array of pointers }

16 Pole ukazatelů (2/2) printf("Addresses of the character o:\n"); for(j=0; j

17 Příklady (1/7) Př. Záměna znaků pomocí ukazatele char text[]="okolo kola okolkovala koala"; char *a; printf("Original string: %s\n\n", text); a=text; while(*a!=NULL) { if(*a=='o') *a='k'; else if(*a=='k') *a='o'; a++; } printf("Changed string: %s\n", text); Příklad: BPC1E_Ex51.c

18 Příklady (2/7) Př. Vyhledání a náhrada textu bez std. funkcí pomocí ukazatelů char text[]="sokol kolem jezdil kolem dokola"; char test[]="kol"; char ntext[]=" "; char *a, *b, *c; int tst; a=text; b=test; printf("Original string: %s\n\n", text); for(a=text; *a!=NULL; a++) { tst=1; c=a; for(b=test; *b!=NULL; b++,c++) if (*c!=*b) tst=0;

19 Příklady (3/7) if(tst) { c=ntext; for(b=test; *b!=NULL; b++, c++, a++) { *a=*c; } printf("Changed string: %s\n", text); Příklad: BPC1E_Ex52.c

20 Příklady (4/7) Př. V řetězcové proměnné wtxt a btxt ve jsou uloženy zhuštěně pozice figurek bílého, resp. černého, na šachovnici se 64 políčky (8x8) ve formě písmeno řádku (A až H) a číslo sloupce (1 až 8). Doplňte program, který postupně projde texty ve wtxt a btxt a do pole field vloží na příslušná místa znaky 'W' a 'B' označující figurku příslušného hráče a situaci vytiskněte do konzolového okna. Procházení řetězci i polem řešte pomocí ukazatelů. #include int main() { char wtxt[]="A6B8A4D7E2C3F1F2"; char btxt[]="C3A7B1D1E4E5F5H3H5"; char field[64]; char *p, *t, i, j;

21 Příklady (5/7) p=field; for(i=0, p=field; i<64; i++, p++) *p= ' '; p=wtxt; do { t=field+8*(*p-'A'); p++; t+=(*p-'1'); *t='W'; p++; } while(*p!='\0');

22 Příklady (6/7) p=btxt; do { t=field+8*(*p-'A'); p++; t+=(*p- '1' ); *t='B'; p++; } while(*p!='\0'); printf("\n |"); for(i='1'; i<='8'; i++) printf("%c|", i); printf("\n -"); for(i='1'; i<='8'; i++) printf("--");

23 Příklady (7/7) for(i='A', p=field; i<='H'; i++) { printf("\n%c |", i); for(j='1'; j<='8'; j++, p++) printf("%c|", *p); } return 0; } Výstup na obrazovce: Příklad: BPC1E_Ex53.c

24 Téma následující přednášky DĚKUJI ZA POZORNOST – Funkce - úvod – Hlavičky funkcí – Rekurze funkcí – Knihovny funkcí – Příklad


Stáhnout ppt "OSNOVA: a) Ukazatel b) Pole a ukazatel c) Pole ukazatelů d) Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 1 pro."

Podobné prezentace


Reklamy Google