130 likes | 315 Views
Ukazatele, řetězce. Přednáška č. 3. Ukazatele. Ukazatel (pointer) – typ o velikosti 4 bajty (v 32bit. systémech) pro uložení adresy objektu na který ukazuje Syntaxe definice ukazatele: <typ objektu na který ukazuje> * <název>; Příklad definice ukazatele na objekt typu int:
E N D
Ukazatele, řetězce Přednáška č. 3
Ukazatele • Ukazatel (pointer) – typ o velikosti 4 bajty (v 32bit. systémech) pro uložení adresy objektu na který ukazuje • Syntaxe definice ukazatele: <typ objektu na který ukazuje> * <název>; • Příklad definice ukazatele na objekt typu int: int* MujPtr; nebo int *MujPtr;
Ukazatele(1) • Lokální proměnné se ukládají na zásobník (blok paměti) od vyšší hodnoty směrem k nižší int a = 5; // lokalni promenna a int b = 8; // lokalni promenna b int* MyPtr; // definice ukazatele na typ int s nazvem MyPtr
Ukazatele(2) MyPtr = &a; *MyPtr = 9;
Ukazatele(3) • Článek o ukazatelích v C++: http://www.elektrorevue.cz/clanky/06029/index.html
ASCII tabulka • Podle ní jsou reprezentovány znaky v řetězci
Řetězce ukončené znakem NULL(1) • NTS ( Null Terminated Strings ) • Pole znaků (char) ukončené znakem NULL (ASCII hodnota 0). Pole proto zabírá v paměti o jeden znak více než je zobrazitelných znaků. • Proměnná, kterou považujeme za řetězec je ve své podstatě ukazatel na první znak řetězce
Řetězce ukončené znakem NULL(2) • Konstantní ukazatele • nelze měnit kam ukazují • pomocí sizeof(a) lze zjistit velikost alokovaného místa • jde v podstatě o pole znaků • vždy se alokuje místo pro uložení znaků řetězce char a[8]; // ukazuje na rezervovany, ale nepredvyplneny obsah char b[]="1234"; // ukazuje na rezervovany a predvyplneny obsah, velikost// pole se doplni automaticky char c[5]="1234"; // ukazuje na rezervovany a predvyplneny obsah char d[] = {'1','2','3','4'}; // !!!chyba - neni retezec ukonceny nulou char e[] = {'1','2','3','4','\0'}; // ukazuje na rezervovany a predvyplneny// obsah, velikost pole se doplni automaticky char f[5] = {'1','2','3','4'}; // v poradku, protoze zbytek pole se doplni// nulami
Řetězce ukončené znakem NULL(3) • Proměnné ukazatele • lze měnit kam ukazují • nelze zjistit velikost alokovaného místa pomocí sizeof(g), sizeof(g) vrací jen velikost ukazatele tedy 4B • jde o ukazatel na znak • místo pro uložení znaků řetězce se nealokuje, musíme přiřadit ukazatel na místo s alokovaným obsahem char *g; // nezinicializovany ukazatel, nevytvori zadne rezervovane misto char *h = "1234"; // inicializovany ukazatel, ukazuje na misto v pameti// obsahujici 5 znaku 1234NULL char bufA[5], bufB[12]; // alokace mista char *strA = &bufA, *strB = bufB; // inicializace promennych ukazatelu tak// aby ukazovaly na rezervovane misto
Řetězce ukončené znakem NULL(4) • Přístup k jednotlivým znakům řetězce • Index znaku počítán od nuly (index 0 znamená 1. pozice - tzv. zero based index) • Pozor na index mimo rozsah! char chSecond1 = a[1]; char chSecond2 = *(a+1);
Operace s řetězci #include <stdio.h> #include <string.h> int main(int argc, char* argv[]) { char vstup[20] = "ABCDE"; char vystup[20]; int n, delka; delka = 5; // strlen(vstup); for( n=0; n<delka; n++) // odzadu vystup[delka-n-1] = *(vstup+n); vystup[delka] = '\0'; printf( "%s\n", vystup); for( n=0; n<delka; n++) // na mala pismena vystup[n] = vstup[n]+32; // v ASCII jsou mala a velka pismena od sebe o 32 vystup[delka] = '\0'; printf( "%s\n", vystup); getchar(); return 0; }
Knihovna pro vstup a výstup <stdio.h> • #include <stdio.h> • Vstupem je klávesnice, výstupem konzolové okno #include <stdio.h> int main(int argc, char* argv[]) { char a[20]; char c; puts("Zadej znak:"); // Tisk neformatovaneho retezce fflush(stdin); // Vyprazdneni vstupniho bufferu c = getchar(); // Cteni znaku z klavesnice puts("Znak byl:"); putchar(c); // Tisk jednoho znaku puts("\nZadej retezec:"); fflush(stdin); gets(a); // Cteni retezce z klavesnice puts("Retezec byl:"); puts(a); fflush(stdin); getchar(); return 0; }
Knihovna pro práci s řetězci <string.h> • #include <string.h> • Pozor na velikost alokovaneho mista u funkci strcpy() a strcat()!!! #include <stdio.h> #include <string.h> int main(int argc, char* argv[]) { char a[20] = "ABCDE"; char b[] = "New"; char *c; int iLen = strlen(a); // vraci delku retezce (pozor neplest s velikosti// alokovaneho mista) int iSize = sizeof(a); // vraci velikost alokovaneho mista strrev( a ); // prehodi retezec pozpatku strlwr( a ); // zameni velka pismena za mala strcpy( a, b ); // zkopiruje obsah retezce b do a (znak po znaku az po NULL) strncpy( a, b, 2 ); // zkopiruje prvni 2 znaky retezce b do a bez znaku NULL! strcat( a, "York" ); // pripoji retezec "York" k retezci a (znak po znaku az// po NULL), a musi byt dostatecne velke c = strchr( a,'Y'); // vraci ukazatel na pozici kde naleznul první vyskyt Y c = strstr( a, "York"); // vraci ukazatel na pozici kde naleznul první vyskyt York printf("a=%s b=%s c=%s Pozice=%d", a, b, c, c-a); getchar(); return 0; }