Stránka 1 z 1

Pointer v C

Napsal: 10 led 2013 17:42
od Drevorubec
Dobrý den! Potřeboval bych se zeptat na jednu věc. Mám totiž vědět, jaké budou proměnné na konci provedení programu. A ten program obsahuje něco, co je strašlivě těžké :D Zde je:

Kód: Vybrat vše

int main(void)
{ int i, j, *p, *q;
p = &j          //do pointeroveho p se da adresa j
q = &i          //do q se da adresa i
i = 4           //do i se da ctverka
j = 22          //do j se da 22
*q = *q+26      //do i se da 30
*p = i+7        //do j se da 37
q = p           //nu, a co se stane tady????
*q = *p+j


Vůbec nevím, co udělá q = p. A tak nemohu pokračovat dál. Je to strašně těžké. Řekli byste, prosím, co ten řádek programu udělá? Děkuji velmi.

Re: Pointer v C#

Napsal: 10 led 2013 18:03
od CZechBoY
řekl bych, že do i se vloží j

tohle není C#, ale C když už...

Re: Pointer v C

Napsal: 10 led 2013 18:16
od Drevorubec
Děkuji za odpověď! Je to C. Takže v tom pípadě v i bude 37? A po posledním řádku bude *q 74.
Ve výsledku je, že na konci tohoto programu má být i=30, j=74, *p=74 a *q=74 taky. A já tedy vůbec nevím, proč i *p má být 74, když je tam naposledy 30+7 (to je 37), a za předpokladu, že se do i dá j by nemohlo i nikdy zůstat 30, ale rovněž 37. Tím pádem je to špatně ve výsledku? :D

Re: Pointer v C

Napsal: 10 led 2013 18:20
od CZechBoY
q=p takže cokoliv vložíš do p je v q a naopak
si to zkus spustit a uvidíš..

Re: Pointer v C

Napsal: 10 led 2013 18:54
od faraon
Pointer se česky nazývá ukazatel, a je to speciální druh proměnné, která ukazuje nějaké místo v paměti. Prostě obsahuje přímo adresu v RAM. Můžeš pracovat s obsahem na té adrese, ale také můžeš pracovat s adresami samotnými! Takže bych to trochu rozvedl:

Kód: Vybrat vše

int main(void)
{ int i, j, *p, *q;
p = &j;          //do pointeroveho p se da adresa j
q = &i;          //do q se da adresa i
i = 4;           //do i se da ctverka
j = 22;          //do j se da 22
*q = *q+26;      /* k číslu na adrese v q se přičte 26 */
*p = i+7;        /* k číslu na adrese v p se přičte 7 */
q = p;           /* do q se okopíruje adresa z p, takže teď oba ukazatele ukazují na proměnnou j */
*q = *p+j;       /* k číslu na adrese v p se přičte hodnota z j, a uloží se na adresu v q, takže se proměnná j zdvojnásobí */

A pokud chceš mít průběžně přehled co tvůj program vyvádí, vlož si za každý příkaz kontrolní výpis, třeba takhle:
printf("%d\t%d\t%d\t%d\n",i,j,*p,*q);
Má to samozřejmě smysl až po přiřazení do i a j, předtím ti to bude psát hausnumera, a před definováním obou ukazatelů ti program dokonce spadne kvůli přístupu do cizí paměti!