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

Hasonló dokumentumok
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

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

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

8. gyakorlat Pointerek, dinamikus memóriakezelés

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.

találhatók. A memória-szervezési modell mondja meg azt, hogy miként

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

Programozas 1. Strukturak, mutatok

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

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

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

A 32 bites x86-os architektúra regiszterei

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:

Adatelérés és memóriakezelés

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

Alkalmazott modul: Programozás 10. fejezet. Strukturált programozás: dinamikus memóriakezelés. Giachetta Roberto

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

Hatékony memóriakezelési technikák. Smidla József Operációkutatási Laboratórium január 16.

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

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

A programozás alapjai

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

1. Alapok. Programozás II

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

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

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

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

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

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

Programozási nyelvek Java

Bonyolultságelmélet. Monday 26 th September, 2016, 18:50

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

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.

Programozás I gyakorlat

C++ programozási nyelv Konstruktorok Gyakorlat

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

5. Gyakorlat. struct diak {

Programozási nyelvek Java

Assembly programozás levelező tagozat

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 nyelven (9. ELŐADÁS) Sapientia EMTE

Pénzügyi algoritmusok

Mi az assembly? Gyakorlatias assembly bevezető. Sokféle assembly van... Mit fogunk mi használni? A NASM fordítóprogramja. Assembly programok fordítása

C++ programozási nyelv

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.

Operációs rendszerek. Az NT memóriakezelése

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Bevezetés a C++ programozási nyelvbe

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Pointerek C-ben, C++-ban

Programozási Nyelvek: C++

10. gyakorlat Struktúrák, uniók, típusdefiníciók

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

OOP #14 (referencia-elv)

Máté: Számítógép architektúrák

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

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

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

Készítette: Nagy Tibor István

Számítógépek felépítése, alapfogalmak

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Bevezetés a programozásba Előadás: A const

Programozás C++ -ban

5-6. ea Created by mrjrm & Pogácsa, frissítette: Félix

LibreOffice Makró Basic

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

Programozás C és C++ -ban

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

Bevezetés a Programozásba II 10. előadás. Dinamikus memóriakezelés

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

Alprogramok fordítása. Kódgenerálás II. (alprogramok, memóriakezelés) Függvény, eljárás. Alprogramok írása assemblyben

C++ programozási nyelv

Készítette: Nagy Tibor István

Adatszerkezetek és algoritmusok

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

Programozás módszertan

Programozás alapjai II. (2. ea) C++

Programozás alapjai II. (2. ea) C++

Adatbázis és szoftverfejlesztés elmélet

Ha meg akarod tudni, hogy az egyes típusok milyen méretűek a te rendszereden, a következő program megmutatja:

Fordító részei. Fordító részei. Kód visszafejtés. Izsó Tamás szeptember 29. Izsó Tamás Fordító részei / 1

Alprogramok, paraméterátadás

Adatszerkezetek 1. Dr. Iványi Péter

Osztályok. 4. gyakorlat

Számítógépek felépítése

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

Programozás III A JAVA TECHNOLÓGIA LÉNYEGE. Többlépcsős fordítás JAVA PLATFORM. Platformfüggetlenség

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

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

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

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

Programozás. Osztályok, Származtatott osztályok. Fodor Attila

Láncolt lista. az itt adott nevet csak a struct deklaráción belül használjuk

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Adatbázis rendszerek Gy: Az adattárolás fejlődése

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

Operációs rendszerek III.

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

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

Átírás:

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

Memória a Neumann-architektúrában Neumann-architektúra: a memória egységes a címzéshez a természetes számokat használjuk Ugyanabban a memóriában van: a programkód a végrehajtáshoz használt verem (stack) az adattárolásra használt halomterület (heap)

Neumann-architektúra

A memória címzése - 4GB RAM esetén 0xFFFFFFFF program számláló verem teteje 0x00000002 0x00000001 0x00000000 verem alja

A referencia-operátor: & double a = 5 ; double p = &a ; A & operátor egy, a változó kezdőcímére mutató pointert ad vissza a változó lehet a veremben is ekkor a cím csak a függvényhíváson belül érvényes! csak hívott függvények adható át visszatérési érték nem lehet maga a pointer is egy változó a stack-en verem teteje p = 0x0 p a = 5

A mutató és a mutató típusa Mutató: olyan változó, amiben egy memóriacím van 32 vagy 64 bites szám (x86 vagy x64 architektúra) alapesetben ugyanúgy a stack-en foglal helyet, mint minden más változó A mutatónak van típusa A mutató ugyan csak egy memóriacím, de a fordító tudja, hogy a mutató milyen típusú adatra mutat double*, int*, Matrix* nem mindegy!

Mutató feloldása operátor: * Pointer által mutatott érték kiolvasása: double a = 5 ; double p = &a ; double b = p ; A pointer által mutatott memória írása: double a = 5 ; double p = &a ; p = 6 ; p r i n t f ( %l f, a ) ; Mit fog kíırni az utolsó sorban a printf?

Figyelem! Ez nem működik: double p ; p = 5 ; Sőt, még ez sem: double a = 5 ; double p ; p = a ; A pointer alapból nem mutat sehova! Ugyanúgy be kell álĺıtani az értékét (azaz a memóriacímet), mint más változónál

Helyfoglalás a heap-en Lefoglalunk valamennyi memóriát: double p ; p = ( double ) m a l l o c (100 s i z e o f ( double ) ) ; p = 5 ; A malloc függvény lefoglalja az előírt számú bájtot visszatér a memóriaterület kezdetének címével????? p 5

Pointerek és tömbök: [ ] operátor A mutatott címhez képest relatív: double p ; p = ( double ) m a l l o c (100 s i z e o f ( double ) ) ; p [ 0 ] = 5 ; p [ 1 ] = 6 ; A [] operátor a tömbön belüli elemet adja vissza tudja, hogy mennyit kell lépni a memóriában???? p[1] = 6 p p[0] = 5

Tömbök és pointerek Ez is működik: double a [ 1 0 ] ; double p ; p = a ; p [ 5 ] = 1 0 ; Sőt, ez is: double a [ 1 0 ] ; a = 5 ; De vajon lehet-e a tömb második elemét címezni tisztán pointeres írásmóddal?

A pointer valójában csak egy memóriacím Vajon ez jelent valamit? double p ; p = ( double ) m a l l o c (100 s i z e o f ( double ) ) ; ( p + 1) = 5 ; Naivan azt gondolnánk, hogy a q + 1 kifejezés a pointerben tárolt memóriacímet növeli eggyel A C fordító valójában okosabb, mert tudja, hogy a q pointer double típusú adatra mutat, így a memóriacímhez nem 1-et, hanem rögtön 8-at hozzá A következők egyenértékűek: *(p + i) p[i] p + i &p[i]

Pointereken értelmezett aritmetikai műveletek Értelmes dolog pointert egész számmal növelni és csökkenteni: double a [ 1 0 ] ; double p ; p = a + 5 ; p = 3 ; p++; Vagyis ez is működik: double a [ 1 0 ] ; double p = a ; f o r ( i = 0 ; i < 1 0 ; i ++) { p++ = i ; }

A pointer tisztában van a mutatott típus méretével Figyelem! A típusok mérete platform- és fordító függő!

Pointerek kasztolása Megszoktuk, és működik: double d = 1 1 2 3 4 ; i n t i = ( i n t ) d ; Vajon a ez a program mit ír ki? double d = 1 1 2 3 4 ; i n t p ; p = ( i n t )&d ; p r i n t f ( %d, p ) ; Válasz: hülyeséget Ugyanis a itt azt feltételezzük, hogy a p által mutatott címen integer van, pedig ott egy double szám van, ami teljesen más formátumban tárolódik a memóriában

Csupasz pointer: void* A void* a pointerek egy univerzális típusa olyankor használjuk, amikor a mutatott adat típusa mindegy például memóriafoglaláskor nem használható rá a mutató feloldása operátor: double d = 1 1 2 3 4 ; void p = &d ; // ez megy p = 5 ; // h i b a Akkor mégis mikor? például ilyen pointert ad vissza a malloc függvény emiatt kell a (double*) minden malloc elé ilyet vár a free függvény is

Tömbök másolása pointerekkel i n t i ; double a [ 1 0 ], b [ 1 0 ] ; double pa, pb ; pa = a ; pb = b ; f o r ( i = 0 ; i < 1 0 ; i ++) { pa++ = pb++; }

Pointer pointerre double a ; double pa, pb ; pa = &a ; pa = 5 ; pb = &pa ; pb = &a ; pb = 6 ;