Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilVítězslav Černý
1
Ukazatele, řetězce Přednáška č. 3
2
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;
3
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
4
Ukazatele(2) MyPtr = &a; *MyPtr = 9;
5
Ukazatele(3) Článek o ukazatelích v C++: http://www.elektrorevue.cz/clanky/06029/in dex.html
6
ASCII tabulka Podle ní jsou reprezentovány znaky v řetězci
7
Ř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
8
Ř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
9
Ř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
10
Ř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);
11
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; }
12
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; }
13
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; }
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.