Felhasználói eszközök

Eszközök a webhelyen


tanszek:oktatas:szamitastechnika:mutatok_pointerek

Különbségek

A kiválasztott változat és az aktuális verzió közötti különbségek a következők.

Összehasonlító nézet linkje

Előző változat mindkét oldalon Előző változat
Következő változat
Előző változat
tanszek:oktatas:szamitastechnika:mutatok_pointerek [2022/09/05 21:21]
superuser
tanszek:oktatas:szamitastechnika:mutatok_pointerek [2023/11/14 11:10] (aktuális)
knehez [Dereferencia]
Sor 1: Sor 1:
 +==== 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).
 +
 +A **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ó a változók deklarációjához,​ de a 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>
 +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. **Feladat 1:** Definiáljunk egy változót és írassuk ki azt a címet, ahol éppen tárolva van a memóriában.
  
Sor 4: Sor 38:
 #include <​stdio.h>​ #include <​stdio.h>​
  
-main()+int main()
 { {
     int a = 12;     int a = 12;
Sor 11: Sor 45:
 </​sxh>​ </​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.
Sor 48: Sor 82:
 #include <​stdio.h>​ #include <​stdio.h>​
  
-main()+int main()
 { {
     int a = 10;     int a = 10;
Sor 71: Sor 105:
 #include <​stdio.h>​ #include <​stdio.h>​
  
-main ()+int main ()
 { {
     int  val = 10;     int  val = 10;
Sor 93: Sor 127:
 #include <​stdio.h>​ #include <​stdio.h>​
  
-main()+int main()
 { {
     char kod;     char kod;
Sor 119: Sor 153:
 </​sxh>​ </​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.1662412895.txt.gz · Utolsó módosítás: 2022/09/05 21:21 szerkesztette: superuser