User Tools

Site Tools


tanszek:oktatas:szamitastechnika:mutatok_pointerek

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
tanszek:oktatas:szamitastechnika:mutatok_pointerek [2022/09/05 21:10] – létrehozva kneheztanszek:oktatas:szamitastechnika:mutatok_pointerek [2023/11/14 11:10] (current) – [Dereferencia] knehez
Line 1: Line 1:
-**Feladat 1:** Definiáljunk egy változót és írassuk ki azt címetahol éppen tárolva van memóriában.+==== Pointerek a C nyelvben ==== 
 + 
 +A pointer a C nyelv egyik kulcsfontosságú fogalma, amely lehetővé teszi a programozók számára, hogy közvetlenül kezeljék/elérjék a memóriát. Más nyelvekben a memória közvetlenül "elérhetetlen" (pl. Java, C#, JavaScript, Python). 
 + 
 +**pointer** //egy memóriacímre mutató változó//, ami lehetővé teszi, hogy közvetlenül hivatkozzunk egy adott memóriaterületre. 
 + 
 +==== Pointer Deklaráció ==== 
 + 
 +A pointer deklarációja hasonló változók deklarációjáhozde típusát is meg kell adni, és a név elé egy **csillagot** írunk 
 + 
 +Például: ha a pointer egy egész szám memóriacímére mutató pointer:
  
 <code c> <code c>
 +int *pointer;
 +</code>
 +
 +==== Pointer inicializálás ====
 +
 +A pointer inicializálása a memóriacímmel történik. Például:
 +<code c>
 +int variable = 10;
 +int *pointer = &variable;
 +</code>
 +Most a pointer változó a 'variable' memóriacímére mutat.
 +
 +==== Dereferencia ====
 +
 +A 'dereferenciálás' segítségével elérhetjük a pointer által mutatott értéket. Például:
 +<code c>
 +int value = *pointer;
 +</code>
 +
 +Most a //value// változó azon értéket tartalmazza, amelyre a //pointer// mutat.
 +
 +**Feladat 1:** Definiáljunk egy változót és írassuk ki azt a címet, ahol éppen tárolva van a memóriában.
 +
 +<sxh c>
 #include <stdio.h> #include <stdio.h>
  
-main()+int main()
 { {
     int a = 12;     int a = 12;
     printf("%p\n", &a);     printf("%p\n", &a);
 } }
-</code>+</sxh>
  
-Megjegyzés: A **printf("%p")** 16-os (hexadecimális) számrendszerben kiírja a címet. A címet a &-jel jelenti. Ha csak 'a'-t írunk akkor 00000C-fog megjelenni, ami a 12 hexadecimális alakja.+Megjegyzés: A **printf("%p")** 16-os (hexadecimális) számrendszerben kiírja a címet. Egy változó címét neve elé írt &-jel jelenti. Ha csak 'a'-t írunk akkor 00000C-fog megjelenni, ami a 12 hexadecimális alakja, azaz a változó értéke, nem a címe lesz.
  
 **Feladat 2:** Definiáljunk egy változót és egy erre a változóra mutató pointert. Írassuk ki a változó értékét a pointer segítségével. **Feladat 2:** Definiáljunk egy változót és egy erre a változóra mutató pointert. Írassuk ki a változó értékét a pointer segítségével.
-<code c>+<sxh c>
 #include <stdio.h> #include <stdio.h>
  
Line 24: Line 58:
     printf("%d\n", *b);  // a b előtti * mutatja, hogy nem a címet, hanem az ott tárolt értéket kell kiíratni     printf("%d\n", *b);  // a b előtti * mutatja, hogy nem a címet, hanem az ott tárolt értéket kell kiíratni
 } }
-</code>+</sxh>
  
 **Feladat 3:** Az előző feladatban adott b pointer segítségével növeljük meg az **a** változó értékét, majd írassuk ki az **a** változót. **Feladat 3:** Az előző feladatban adott b pointer segítségével növeljük meg az **a** változó értékét, majd írassuk ki az **a** változót.
  
-<code c>+<sxh c>
 #include <stdio.h> #include <stdio.h>
  
Line 41: Line 75:
     printf("%d\n", a);      printf("%d\n", a); 
 } }
-</code>+</sxh>
  
 **Érték növelése pointeren kereszül** **Érték növelése pointeren kereszül**
  
-<code c>+<sxh c>
 #include <stdio.h> #include <stdio.h>
  
-main()+int main()
 { {
     int a = 10;     int a = 10;
Line 58: Line 92:
     printf("%d", a);     printf("%d", a);
 } }
-</code>+</sxh>
  
 Nem lett 11 **a** értéke. Miért? Mert (*b)++ -t kellett volna írni. Nem lett 11 **a** értéke. Miért? Mert (*b)++ -t kellett volna írni.
Line 68: Line 102:
 Hozzunk létre egy másik pointert ami az első pointerre mutat. Irjuk ki a pointerek által mutatott címen tárolt értéket! Hozzunk létre egy másik pointert ami az első pointerre mutat. Irjuk ki a pointerek által mutatott címen tárolt értéket!
  
-<code c>+<sxh c>
 #include <stdio.h> #include <stdio.h>
  
-main ()+int main ()
 { {
     int  val = 10;     int  val = 10;
Line 84: Line 118:
     printf("**pptr = %d\n", **pptr);     printf("**pptr = %d\n", **pptr);
 } }
-</code>+</sxh>
  
 **Érdekesség: Jelszó feltörés** **Érdekesség: Jelszó feltörés**
Line 90: Line 124:
 Az alábbi program bekér egy karaktert a felhasználótól. Ha nem c-t nyom akkor nem helyes a kódja.  Az alábbi program bekér egy karaktert a felhasználótól. Ha nem c-t nyom akkor nem helyes a kódja. 
  
-<code c>+<sxh c>
 #include <stdio.h> #include <stdio.h>
  
-main()+int main()
 { {
     char kod;     char kod;
Line 117: Line 151:
 } }
  
-</code> +</sxh>
- +
-Látva a kódot, ha tegyük fel 8db bármilyen karaktert ütünk be, akkor is rendszergazdák leszünk. Magyarázzuk meg miért? (azért, mert a scanf felülírja a memóriát és a "helyes" érték 0-ja felülíródik. Ezt nevezzük "buffer túlcsordulásos" támadásnak.+
  
 +Látva a kódot, ha tegyük fel 5db bármilyen karaktert ütünk be, akkor is rendszergazdák leszünk. (érdemes kikísérletezni hány darab leütés kell, hogy elromoljon a működés) Magyarázzuk meg miért? (azért, mert a scanf felülírja a memóriát és a "helyes" érték 0-ja felülíródik. Ezt nevezzük "buffer túlcsordulásos" támadásnak.
tanszek/oktatas/szamitastechnika/mutatok_pointerek.1662412236.txt.gz · Last modified: 2022/09/05 21:10 by knehez