IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – 1. diel - Úvod do ukazovateľov (pointer) v jazyku C

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Neaktivní uživatel:3.12.2014 16:34

Dobrý den, chtěla bych Vás upozornit na chybu v posledním zdrojovém kódu ve funkci printf() chybí řídící řetězec formátu. Jinak bych Vám chtěla poděkovat za Vaše články, dost mi, jakožto "programátorovi - začátečníkovi", pomáhají.

Odpovedať
3.12.2014 16:34
Neaktivní uživatelský účet
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Neaktivní uživatel
David Hartinger:3.12.2014 16:55

Díky, opravil jsem :)

Odpovedať
3.12.2014 16:55
New kid back on the block with a R.I.P
Avatar
Lukáš Hruda
Tvůrce
Avatar
Lukáš Hruda:3.12.2014 21:02

Možná by bylo dobré uvést něco o endianitě. Třeba v příkladu přiřazení hodnoty 15 na adresu 0x23aadc by na Win 7 bylo pořadí bytů přesně obráceně. Pokud člověk nějakým způsobem pracuje s jednotlivými byty v paměti, je dobré o tom vědět.

 
Odpovedať
3.12.2014 21:02
Avatar
Matej
Člen
Avatar
Matej:11.10.2015 12:26

Ako si Ccko interpretuje argumenty? Resp v kode

void prohod(int *p_a, int *p_b)
{
    int pomocna = *p_a;
    *p_a = *p_b;
    *p_b = pomocna;
}

ked sa dosadi &a ,&b , sa len vymeni pamet premennej (tj pamat a = pamat b tj aj hodnota ) alebo iba hodnota (v pamati , (hodnota pameti a sa nadstavi na b ). Ak je to ten prvy pripad , neni zbytocne davat pointeri ako parametre funkcie?

Editované 11.10.2015 12:26
 
Odpovedať
11.10.2015 12:26
Avatar
tomisoka
Tvůrce
Avatar
Odpovedá na Matej
tomisoka:11.10.2015 12:58

Vymění se jen hodnota.

Pokud se volá funkce tak argumenty se kterými pracuješ ve funkci jsou jenom kopie. Takže pokud by jsi tu funkci měl napsanou bez těch pointerů, tak by to prohodilo jenom ty kopie (z venku by to vypadalo, jako že ta funkce nic neudělala). Ale protože jako argument máš pointer, tak ten pointer je sice kopie, ale ukazuje na stejnou adresu jako originální pointer.

Editované 11.10.2015 12:59
 
Odpovedať
11.10.2015 12:58
Avatar
Matej
Člen
Avatar
Matej:11.10.2015 14:42

ak dosadime do funkcie &a a &b

void prohod(int *p_a, int *p_b) // dosadime &a , &b
{
    int pomocna = *p_a; // pomocna je refencia na pamat a (&a)
    *p_a = *p_b; // pamat _a sa nadstavi na pamat _b tj aj na odkazujucu hodnotu
    *p_b = pomocna; // naopak
}

ak sa to bere takto , tnak sa nezmeni iba hodnota ale swapne sa cela pamat aj s hotou nie? podla predchadzajuceho prikladu na pointeri by sa hodota swapla iba ak by dany pointer (teda ak som pochopil spravne pointer v argument liste sa spava ako pointer) musel odkazovat na danu hodnotu tj

*p_a=b

a nie

*p_a=&b //referencia na pamat

V c som novy takze si to asi zle vykladam ale stale mi to nesedi :D

 
Odpovedať
11.10.2015 14:42
Avatar
tomisoka
Tvůrce
Avatar
Odpovedá na Matej
tomisoka:11.10.2015 16:00

Však taky platí:

p_a=&a

a z toho plyne:

*p_a=a

A okomentovaná funkce:

void prohod(int *p_a, int *p_b){ // dosadime &a, &b
  int pomocna = *p_a;//pomocna je přepsána hodnotou na kterou ukazuje pointer p_a(a)
  *p_a = *p_b; // hodnota na kterou ukazuje pointer p_a (a) je přepsána hodnotou na
  //kterou ukazuje pointer p_b (b)
  *p_b = pomocna; // hodnota na kterou ukazuje p_b (b) je přepsána hodnotou pomocna
}

Jinak dál se ve tvém komentáři nějak ztrácím, co znamená:

tnak sa nezmeni iba hodnota ale swapne sa cela pamat aj s hotou nie?

 
Odpovedať
11.10.2015 16:00
Avatar
Matej
Člen
Avatar
Odpovedá na tomisoka
Matej:11.10.2015 16:37

ak som to spravne pochopil tak ak das

*p_a=&a

tak vlastne nastane

p_a=&a;
*p_a= hodnota a

a ked dosadis do pointeru ktory je ako argument adresu k pameti ako parameter, tak sa priradi hodnota k tomu pointeru? :D

 
Odpovedať
11.10.2015 16:37
Avatar
tomisoka
Tvůrce
Avatar
Odpovedá na Matej
tomisoka:11.10.2015 17:03

Ale v tom kódu není nic jako:

*p_a=&a

Ta část v parametru "int *" je datový typ a "p_a" je název proměnné.
Pokud do pointeru "p_a" dosadíš adresu k paměti, tak pak pomocí "*p_a" pracuješ s hodnotou, která se nachází na té dosazené adrese. Samotná hodnota není k ničemu přiřazená, ta se prostě nachází na té adrese.

Editované 11.10.2015 17:04
 
Odpovedať
11.10.2015 17:03
Avatar
pangas
Člen
Avatar
pangas:10.3.2016 14:10

Zdravím, měl bych malý dotaz. Nějak se mi nedaří inicializovat ukazatel na dvourozměrné pole. Chybové hlášení zní: cannot convert 'char()[26]' to 'char' in initialization.

char abcd[26][26];
char * u = abcd;

Díky za každý tip.

 
Odpovedať
10.3.2016 14:10
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!