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

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

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

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

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

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

Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamá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.

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

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

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

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

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 I. 5. Előadás: Függvények

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

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

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

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á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

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

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

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

A C programozási nyelv I. Bevezetés

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

A C programozási nyelv I. Bevezetés

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:

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 memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

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

10. gyakorlat. Pointerek Tárolási osztályok

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)

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Java II. I A Java programozási nyelv alapelemei

1. Alapok. Programozás II

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

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

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

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

5. Gyakorlat. struct diak {

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

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

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

Programozás I gyakorlat

Információs Technológia

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

Programozás C és C++ -ban

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Java II. I A Java programozási nyelv alapelemei

Programozas 1. Strukturak, mutatok

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

8. gyakorlat Pointerek, dinamikus memóriakezelés

Programozás alapjai 1. (BMEVIEEA100)

Programozás alapjai 2.Gy: A C nyelv alapjai P R O

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

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

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

Programozás I. gyakorlat

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.

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

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

Osztály és objektum fogalma

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

OOP #14 (referencia-elv)

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

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

Programozási Nyelvek: C++

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

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

Bevezetés a C++ programozási nyelvbe

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

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

A C programozási nyelv VI. Parancssori argumentumok File kezelés

Programozás C++ -ban

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

Objektumok tulajdonságai

Információs Technológia

Típusok és konstansok

Programozás I gyakorlat

Programozás C++ -ban 2007/4

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

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

Pénzügyi algoritmusok

Mintavételes szabályozás mikrovezérlő segítségével

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

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Programozás C++ -ban 2007/1

Információs Technológia

M veletek és kifejezések

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

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

C programozás. 1 óra Bevezetés

Programozás II. Fájlkezelés

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Programozás C++ -ban

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

3. Osztályok II. Programozás II

Kivételkezelés a C++ nyelvben Bevezetés

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

Pointerek C-ben, C++-ban

Átírás:

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamá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. 2013.05.08. 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á. 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 3

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 */ 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 4

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. 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 5

int *ip 5.1. Mutatók és címek precedencia példa *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. 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 6

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)++ 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 7

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; 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 8

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; } 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 9

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. 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 10

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. 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 11

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. 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 12

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.: /,%)) 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 13

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: 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 14

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++) ; } 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 15

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. 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 16

Dinamikus memóriafoglalás void * malloc ( size_t size ); void * calloc ( size_t num, size_t size ); void * realloc ( void * ptr, size_t size ); void free ( void * ptr ); 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 17

Példa dinamikus memóriafoglalásra #include<stdio.h> #include<stdlib.h> int main(void) { unsigned m,i; double *t; printf("mekkora tomb kell? "); scanf("%u",&m);// memóriafoglalás t=(double*)malloc(m*sizeof(double)); if(t==null) { printf("sikertelen allokalas.\n"); exit(1); }// Innentől úgy használjuk, mint egy közönséges tömböt. printf("\nt merete: %d \n",sizeof t); for(i=0;i<m;i++) t[i]=i; for(i=m-1;i+1!=0;i--) printf("%g ",t[i]); free(t); system("pause"); // felszabadítás, ha már nem kell return 0; } 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 18

#include <stdio.h> #include <stdlib.h> void kiir0(int a[]); int main(int argc, char *argv[]) { int a[10],i; for (i=0;i<sizeof a/sizeof i;i++) a[i]=i*2; for (i=0;i<sizeof a/sizeof i;i++) printf("%d ",a[i]); printf("\n"); kiir0(a); system("pause"); return 0; } void kiir0(int a[]) // HIBÁS!!!!! { int i; for (i=0;i<sizeof a/sizeof i;i++) printf("%d ",a[i]); } 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 19

#include <stdio.h> #include <stdlib.h> void kiir1(int a[]); int main(int argc, char *argv[]) { int a[10],i; for (i=0;i<sizeof a/sizeof i;i++) a[i]=i*2; for (i=0;i<sizeof a/sizeof i;i++) printf("%d ",a[i]); printf("\n"); kiir0(a); system("pause"); return 0; } void kiir1(int a[],int n) { int i; for (i=0;i<n;i++) printf("%d ",a[i]); } 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 20

#include <stdio.h> #include <stdlib.h> void kiir2(int *a, int n); int main(int argc, char *argv[]) { int a[10],i; for (i=0;i<sizeof a/sizeof i;i++) a[i]=i*2; for (i=0;i<sizeof a/sizeof i;i++) printf("%d ",a[i]); printf("\n"); kiir0(a); system("pause"); return 0; } void kiir2(int *a,int n) { int i; for (i=0;i<n;i++) printf("%d ",*(a+i)); } 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 21

Vége Köszönöm a figyelmet! 2013.05.08. Dr. Bécsi Tamás: Járműfedélzeti rendszerek II. 22