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: * ; * ; 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++: dex.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 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 Knihovna pro vstup a výstup #include #include Vstupem je klávesnice, výstupem konzolové okno #include 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 Knihovna pro práci s řetězci #include #include Pozor na velikost alokovaneho mista u funkci strcpy() a strcat()!!! #include 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; }