1 / 13

Ukazatele, řetězce

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:

trista
Download Presentation

Ukazatele, řetězce

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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: <typ objektu na který ukazuje> * <název>; • 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/index.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 <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; }

  12. 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; }

  13. 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; }

More Related