Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Mutatók. Dr. Bécsi Tamás 7. Előadás

Hasonló dokumentumok
Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

Járműfedélzeti rendszerek II. 5. előadás Dr. Bécsi Tamás

C string műveletek (string.h alkalmazása)

Programozás I gyakorlat. 10. Stringek, mutatók

Programozás C nyelven (10a. ELŐADÁS) Sapientia EMTE

Pénzügyi algoritmusok

Programozás C nyelven (10. ELŐADÁS) Sapientia EMTE

A C programozási nyelv III. Pointerek és tömbök.

C programozási nyelv Pointerek, tömbök, pointer aritmetika

A C programozási nyelv III. Pointerek és tömbök.

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Előfeldolgozó rendszer Tömbök. Dr. Bécsi Tamás 4. Előadás

Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás

Programozás I gyakorlat

Járműfedélzeti rendszerek II. 4. előadás Dr. Bécsi Tamás

Karakter- és sztringkezelő függvények, matematikai függvények

Szövegek C++ -ban, a string osztály

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

Kifejezések. Kozsik Tamás. December 11, 2016

A C programozási nyelv I. Bevezetés

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

A C programozási nyelv I. Bevezetés

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Java II. I A Java programozási nyelv alapelemei

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Programozás 6. Dr. Iványi Péter

Programozás II. 4. Dr. Iványi Péter

Programozás alapjai 9.Gy: Struktúra 2.

Mutatók és mutató-aritmetika C-ben március 19.

Programozás II. 2. Dr. Iványi Péter

Java II. I A Java programozási nyelv alapelemei

Járműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás

Programozás C és C++ -ban

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós szeptember 27. Széchenyi István Egyetem, Gy r

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

1. Alapok. Programozás II

10. gyakorlat Tömb, mint függvény argumentum

7/8. gyakorlat Karaktertömbök és sztringkezelés

malloc free malloc free int sum(int a[4]) { return a[0] + a[1] + a[2] + a[3]; }

Preprocesszor. Programozás alapjai C nyelv 11. gyakorlat. Makrók (2) Makrók (#define) Makrók (3) #include

Programozás C++ -ban 2007/1

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Programozás BMEKOKAA146. Dr. Bécsi Tamás 2. előadás

5. gyakorlat. Konstansok Tömbök Stringek

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Programozás alapjai C nyelv 11. gyakorlat. Preprocesszor. Makrók (#define)

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 2. előadás

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Kifejezések. Kozsik Tamás. December 11, 2016

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

5. Gyakorlat. struct diak {

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

Programozási Nyelvek: C++

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Programozás I. 5. Előadás: Függvények

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

main int main(int argc, char* argv[]) { return 0; } main return 0; (int argc, char* argv[]) main int int int main main main

C programozás. 1 óra Bevezetés

file./script.sh > Bourne-Again shell script text executable << tartalmat néz >>

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Bevezetés a C programozási nyelvbe. Az Általános Informatikai Tanszék C nyelvi kódolási szabványa

1. Jelölje meg az összes igaz állítást a következők közül!

A C# programozási nyelv alapjai

SZÁMÍTÓGÉPES PROBLÉMAMEGOLDÁS

Kifejezések. A programozás alapjai előadás. Operátorok. Kifejezések. Operátorok precedenciája. Operátorok precedenciája

Óbudai Egyetem. C programozási nyelv

7. fejezet: Mutatók és tömbök

/* Az iter függvény meghívása és a visszatérő érték átadása a gyok változóba */ gyok = iter( n, a, e ) ;

Struktúrák (struct) A struktúra szerkezetét meghatározó deklaráció általános formája:

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Programozas 1. Strukturak, mutatok

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

A programozás alapjai

Típusok és konstansok

Objektumorientált Programozás VI.

Programozás C és C++ -ban

Példák tematikus csoportosításban

Vezérlési szerkezetek

Programozás I gyakorlat

Alprogramok, paraméterátadás

Bevezetés a programozásba. 9. Előadás: Rekordok

Objektumok inicializálása

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Óbudai Egyetem. C programozási nyelv

C programozási nyelv

Programozás alapjai. 5. előadás

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

C programozási nyelv

Maximum kiválasztás tömbben

Programozás 5. Dr. Iványi Péter

Programozás alapjai 8.Gy: Program struktúra

Információs Technológia

Átírás:

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Mutatók Dr. Bécsi Tamás 7. Előadás

5.3. Mutatók,tömbök A mutató vagy pointer olyan változó, amely egy másik változó címét tartalmazza. A C nyelvű programokban gyakran használják a mutatókat, egyrészt mert bizonyos feladatokat csak velük lehet megoldani, másrészt mert alkalmazásukkal sokkal tömörebb és hatékonyabb program hozható létre. 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 2

5.1. Mutatók és címek Az & unáris (egyoperandusú) operátor megadja egy operandus címét, ezért a p = &c; utasítás c címét hozzárendeli a p változóhoz és ilyenkor azt mondjuk, hogy p c-re mutat. A * unáris operátor neve indirekció, és ha egy mutatóra alkalmazzuk, akkor a mutató által megcímzett változóhoz férhetünk hozzá. 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 3

Mutatók Példa int i=10; int *ip; ip=&i; printf("%d\n",*ip); i++; printf("%d\n",*ip); Console: 10 11 Memória cím (bájt sorszám) Változónév Érték (int) 1000? 1004 i 10 11 1008 ip? 1004 1012? ---- *ip? 10 11 &i 1004

5.1. Mutatók és címek operátorok példa int x = 1, y = 2, z[10]; int *ip;/* ip int tipushoz tartozó mutató */ ip = &x;/* ip x-re mutat */ y = *ip;/* y most 1 lesz */ *ip = 0;/* most x nulla lesz */ ip = &z[0];/* ip most z[0]-ra mutat */ 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 5

5.1. Mutatók és címek Az indirekció alapján látható, hogy egy mutató mindig meghatározott objektumra mutat, azaz minden mutató meghatározott adattípust jelöl ki. (Ez alól csak egy kivétel van, a void típushoz tartozó mutató, ami egy olyan adat, amely bármilyen mutatót tartalmazhat. Erre az a megszorítás érvényes, hogy önmagára nem alkalmazhatja az indirekciót. 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 6

5.1. Mutatók és címek precedencia példa int *ip *ip = *ip + 10; //*ip-et tízzel növeli Az & és * unáris operátorok szorosabban kötnek, mint az aritmetikai operátorok, ezért az y = *ip + 1 kifejezés kiértékelésekor a gép először veszi azt az adatot, amire ip mutat, hozzáad egyet, majd az eredményt hozzárendeli y-hoz. 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 7

5.1. Mutatók és címek precedencia példa Az *ip += 1 inkrementálja azt a változót, amire ip mutat, csakúgy, mint a ++*ip vagy az (*ip)++ 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 8

5.2. Mutatók és függvényargumentumok Mivel a C nyelv a függvényeknek érték szerint adja át az argumentumokat, így a hívott függvény nem tudja megváltoztatni a hívó függvény változóit. swap(a, b); void swap(int x, int y) /* Hibás!!! */ { int temp= x; x = y; } y = temp; 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 9

5.2. Mutatók és függvényargumentumok Mivel a függvényt érték szerint hívjuk, a swap nem képes a hívásában szereplő a és b argumentumokat befolyásolni (azoknak csak egy helyi másolatával dolgozik, ezek cseréje pedig nem befolyásolná az eredeti argumentumok sorrendjét). swap(&a, &b); void swap(int *px, int *py) /* Helyes */ { int temp=*px; *px = *py; *py = temp; } 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 10

5.3. Mutatók és tömbök A C nyelvben a mutatók és a tömbök között szoros kapcsolat van. Az int a[10]; deklaráció egy tízelemű tömböt jelöl ki, azaz tíz egymást követő, a[0]...a[9] névvel ellátott objektumot. 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 11

5.3. Mutatók és tömbök Az a[i] jelölés a tömb i-edik elemére hivatkozik. Ha pa egy egész típushoz tartozó mutató, amit int *pa; módon deklaráltunk, akkor a pa = &a[0]; értékadás hatására pa az a tömb nulladik elemére fog mutatni, vagyis pa az a[0] címét fogja tartalmazni. 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 12

5.3. Mutatók és tömbök Ennek megfelelően az x=*pa; értékeadás a[0] értékét másolja x-be. A *(pa+1) a[i]-ik elemére mutat a[0] és a ugyanaz a mutató, ezért: pa = &a[0]; ekvivalens a pa=a; kifejezéssel. a[i] ekvivalens *(a+i) hivatkozással. 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 13

5.3. Mutatók és tömbök Példa int t[3]={2,4,6},i,*pi; pi=t; for(i=0;i<3;i++) printf("%d %d %d\n",t[i],*(t+i),*(pi+i)); do{ printf("%d\n",*(pi)); }while (++pi-t<3); Cím Cím hivatkozás Érték hivatkozás 1000 &t[0] t pi t[0] *t *pi 2 1004 &t[1] t+1 pi+1 t[1] *(t+1) *(pi+1) 4 1008 &t[2] t+2 pi+2 t[2] *(t+2) *(pi+2) 6 Érték 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 14

5.4. Címaritmetika Ha p egy tömb valamelyik elemének mutatója, akkor p++ inkrementálja a p mutatót, hogy az a tömb következő elemére mutasson és p+=i pedig úgy növeli p-t, hogy az az aktuális elem utáni i-edik elemre mutasson. Mutatók esetén általában igaz, hogy az int típusra alkalmazható operátorok alkalmazhatóak rá. (bár bizonyos eseteknek nem nagyon van értelmük (pld.: /,%)) 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 15

5.5. Karaktermutatók és függvények Az "Ez egy karaktersorozat" alakban írt karaktersorozat állandók valójában karakterekből álló tömbök, amelyeket a belső ábrázolásban egy nullkarakter ('\0') zár. char auzenet[] = "Itt az ido"; /* ez egy tömb */ char *puzenet = "Itt az ido"; /* ez egy mutató */ Ennek megfelelően stringek esetén az s=t; utasítás csak a pointert másolja a karaktereket nem helyezi el új tömbben, ez külön ciklussal kell megoldani: 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 16

5.5. Karaktermutatók és függvények Az strcpy függvény a standard könyvtárban (a <string.h> headerben) található, és visszatérési értéke az átmásolt karaktersorozat. A fent ismertetett megoldás nem foglalkozik azonban a különböző méretű tömbök problémakörével. 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 17

5.5. Karaktermutatók és függvények void strcpy(char *s, char *t) { int i = 0; while ((s[i] = t[i])!= '\0') i++; } vagy egyszerűbben: void strcpy(char *s, char *t) { while(*s++ = *t++) ; } 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 18

B3. Karaktersorozat-kezelő függvények: a <string.h> header char *strcpy(s, ct) Az strcpy függvény a ct karaktersorozatot átmásolja az s karaktersorozatba, beleértve act-t záró '\0' végjelet is. A függvény visszatérési értéke s mutatója. char *strncpy(s, ct, n) Az strncpy függvény a ct-ből n karaktert átmásol s-be és visszatér s mutatójával. Az s végét '\0' végjelekkel tölti fel, ha ct n karakternél rövidebb volt. char *strcat(s, ct) Az strcat függvény a ct karaktersorozatot az s karaktersorozat végéhez fűzi (konkatenálja) és visszatér s mutatójával. char *strncat(s, ct, n) Az strncat függvény a ct karaktersorozatból n karaktert az s karaktersorozat végéhez fűz, s-t lezárja a '\0' végjellel és visszatér s mutatójával. 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 19

Strcpy példa /* strcpy example */ #include <stdio.h> #include <string.h> int main () { char str1[]="sample string"; char str2[40]; char str3[40]; strcpy (str2,str1); strcpy (str3,"copy successful"); printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3); return 0; } str1: Sample string str2: Sample string str3: copy successful 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 20

Strncpy példa #include <stdio.h> #include <string.h> int main () To be or not to be To be or not to be To be { char str1[]= "To be or not to be"; char str2[40]; char str3[40]; /* túlcsordulás biztos másolás: */ strncpy ( str2, str1, sizeof(str2) ); /* részleges másolás (csak 5 karakter): */ strncpy ( str3, str2, 5 ); str3[5] = '\0'; /* null karakter manuálisan beállítva */ printf("%s \n%s \n%s\n ", str1, str2, str3); return 0; } 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 21

Strcat,strncat példa #include <stdio.h> #include <string.h> int main () { char str[80]; strcpy (str,"ezeket "); strcat (str,"a "); strcat (str,"stringeket "); strncat (str,"osszefuztem. ",5); printf("%s",str); return 0; } ezeket a stringeket ossze 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 22

B3. Karaktersorozat-kezelő függvények: a <string.h> header int strcmp(cs, ct)az strcmp függvény összehasonlítja a cs karaktersorozatot a ct karaktersorozattal és visszatér negatív értékkel, ha cs < ct, nulla értékkel, ha cs == ct és pozitív értékkel, ha cs > ct. int strncmp(cs, ct, n)az strncmp függvény összehasonlítja a cs karaktersorozat legfeljebb n karakterét a ct karaktersorozattal és visszatér negatív értékkel, ha cs < ct, nulla értékkel, ha cs == ct és pozitív értékkel, ha cs > ct. char *strchr(cs, c)az strchr függvény a c karakter cs-beli első előfordulási helyének mutatójával, ill. ha c nem található meg cs-ben, akkor NULL értékű mutatóval tér vissza. char *strrchr(cs, c)az strrchr függvény a c karakter cs-beli utolsó előfordulási helyének mutatójával, ill. ha c nem található meg cs-ben, akkor NULL értékű mutatóval tér vissza. 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 23

Strcmp példa #include <stdio.h> #include <string.h> Mi a kedvenc gyumolcsom? narancs Mi a kedvenc gyumolcsom? alma Helyes! int main() { char szkey[] = "alma"; char szinput[80]; do { printf ("Mi a kedvenc gyumolcsom? "); scanf("%s",&szinput); } while (strcmp (szkey,szinput)!= 0); printf("helyes!"); return 0; } 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 24

Strncmp példa #include <stdio.h> #include <string.h> R2-es droidokat keresunk... Egyezes: R2D2 Nem ez a droid, amit keresnek! Egyezes: R2A6 int main () { char str[][5] = { "R2D2", "C3PO", "R2A6" }; int n; printf("r2-es droidokat keresunk..."); for (n=0 ; n<3 ; n++) if (strncmp (str[n],"r2xx",2) == 0) printf ("Egyezes: %s\n",str[n]); else printf("nem ez a droid, amit keresnek!\n"); return 0; } 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 25

Strchr példa #include <stdio.h> #include <string.h> int main () { char str[] = "This is a sample string"; char * pch; pch=strchr(str,'s'); while (pch!=null) { printf ("Talalt: %d. karakter\n",pch-str+1); pch=strchr(pch+1,'s'); } } return 0; Talalt: 4. karakter Talalt: 7. karakter Talalt: 11. karakter Talalt: 18. karakter 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 26

B3. Karaktersorozat-kezelő függvények: a <string.h> header char *strstr(cs, ct)az strstr függvény visszatérési értéke a ct karaktersorozat cs-beli első előfordulásának kezdetét címző mutató, vagy NULL, ha a ct nem található meg cs-ben. size_t strlen(cs)az strlen függvény visszatérési értéke a cs karaktersorozat hossza. char *strerror(n)az strerror függvény az n hibaszámhoz tartozó, a gépi megvalósítástól függő hibaüzenet karaktersorozatának mutatójával tér vissza. 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 27

Strstr példa #include <stdio.h> This is a simple string #include <string.h> This is a sample string int main () { char str[] ="This is a simple string"; char * pch; printf("%s\n",str); pch = strstr (str,"simple"); strncpy (pch,"sample",6); printf("%s\n",str); return 0; } 2016.03.01. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 28