Pereiti prie turinio

Rekomenduojami pranešimai

Sveiki,

Taigi tenka kažkiek pasimokyti C.

Dabar norėčiau pilnai išsiaiškinti su pointeriais. Teorija lyg ir suprantu, bet vat norėjau pasitikslinti.

1.

  int x, *ptrX;
  x=10;
  *ptrX=&x;   //A    
   ptrX=&x;   //B

Mačiau daug skirtingų variantų (A ir B), kaip suprantu galima naudoti abu, taip?

& - duoda adresą, * - duodą reikšmę. O ką duoda tiesiog kintamojo vardas?

 

2.

  int x, *ptrX;
  x=10;
  ptrX=&x;  
  *ptrX=8; 

Dabar priskiriu ptrX'ui X'o adresą, ir tarkim po to pakeičiu ptrX į 8, ar tokiu atveju X'as irgi tampa 8?

3. Jeigu funkcijos antraštėje yra nurodyta, jog reikalaujama argumentų kaip rodyklių pvz:

  function f(int *,int *)

Tai kreipiantis į funkciją būtinai reikia perduoti taip:

   f(&x,&y);

? Ir Tie kintamieji turi būti aprašyti kaip rodyklės, ar gali būti tiesiog (int x;y) ?

 

4. Dar klausimas iš teorijos, kas yra nuorodos? Kažkaip negaliu surasti normalaus atsakymo.

 

5. Funkcijos argumentai gali būti perduoti tik dviem būdais (by value, by refference). Tai čia kaip suprantu, pagal reikšmę (jeigu tiesiog be rodyklių perduoti duomenis tiesiogiai), o by refference...Tai čia kaip?

6. Ar galima sakyti kad visi 3 žemiau pateikti veiksmai yra teisingi? :

n++;
*n++;
::n++;

Kaip suprantu pirmas tai elementaru, trečias tai tiesiog imamas globalus n tai irgi normalus, o vat kaip dėl antro, ar čia bus pastūmiamas adresas, ar jo reikšmė? Nes, kaip suprantu (*n)++; ir *n++; yra skirtingi dalykai.

 

Labai ačiū už atsakymus :)

Redagavo EdFoX
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pamėginsiu kuo paprasčiau, bet čia labai sudėtinga tema, geriau yra, kai gali ją vizualiai schematiškai parodyti ant popieriaus lapo

 

 

1. Pradėjau galvot ir pats susivėliau iš tiesų. Pagal mane, tai A variantas yra blogas. Kadangi *ptrX == reikšmė į kurią rodo pointeris. Tačiau pointeriui dar nebuvo priskirtas joks adresas. Schematiškai atrodytų taip:

 

ptrX -> /*nežinomybė(šiukšlės)*/ -> x

 

O B variantas

 

prtX-> x

 

BET nesu tikras dėl šito.

 

 

2. Taip, teisingai supratai, nes

 

ptrX-> x  //iki x dar galima nusigauti naudojant *ptrX

 

3. Jeigu kintamieji aprašyti kaip int x,y; tada kreipiamės f(&x, &y)

Jeigu kintamieji aprašyti kaip int *x, *y; tada kreipiamės f(x, y)

 

4. Nežinau, aš angliškai mokiausi šitų dalykų :) Pagooglink!

 

5. by value, reiškia, kad funkcija gauna savo kopiją x.

int x = 1, y = 2;  
f(x, y)

čia yra perdavimas by value. funkcija šiuo atveju gauna savo kopijas x ir y. net jeigu funkcijoje yra pakeičiamos x ir y reikšmės, pasibaigus funkcijai, pradinis x == 1, y == 2.

 

int x = 1, y = 2;  
f(&x, &y)

čia yra kreipimasis by refference. funkcija šiuo atveju gauna pointerius į x ir y. viskas, ką funkcija padaro su x ir y atsispindi ir pasibaigus funkcijai.

 

 

6. 2 atveju yra pastumiamas adresas. pirmą ir trečia pagavai pats (:

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Laabai dėkui už išsamų atsakymą.

Jeigu plačiau su 5 klausimu. By Refference tema

Jeigu aš turiu funkciją

function swap(int *x,int *y){
       int temp;
        /* Pirmas variantas */
        temp=*x;
        x=&y;
        y=&temp;
       /*   ------- */ 
      /* Antras variantas */
        temp=*x;
        *x=*y;
        *y=temp;
       /*   ------- */ 

}

Taigi ar abu variantai yra ekvivalentūs?

Bei, aš su kintamasiais vidury funkcijos (kreipimaisi ir priskirymai) elgsiuos vienodai, nepriklausant nuo to ar programoje į funkciją kreipėsi paprasti kintamieji (int x,y; swap(&x,&y), ar rodyklės (int *x,*y; swap(x,y); ?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pirmasis variantas bus blogas, kadangi iš esmės tu gauni kopiją x ir y adreso. Galima sakyti, kad įvyko adreso perdavimas by value (kai perduodi kintamąjį by reference, tai adresą visada by value). Jeigu tu funkcijos viduje pakeisi tai, į ką rodo adresas, tai pasibaigus funkcijai, x ir y kurie buvo perduoti į funkciją vis dar turės pradines reikšmes.

 

Tuo tarpu antras geras, kadangi dirbama su tuo, į ką rodo rodyklės.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisiminiau, ar galima taip deklaruoti masyvą:

int a[]

Ta prasme, ar galima turėti betkokio dydžio masyvą, žinau, kad galima taip rašyti, jeigu iškart jį inicializuoji pvz .

 int a[]={3,5,63,5};

O kaip pirmu atveju?

 

 

Ir dar, kokie tipai yra laikomi baziniai? Nes visur skirtingai rašoma. Pvz short,long - Tinka ar ne?

Redagavo EdFoX
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisiminiau, ar galima taip deklaruoti masyvą:

int a[]

Ta prasme, ar galima turėti betkokio dydžio masyvą, žinau, kad galima taip rašyti, jeigu iškart jį inicializuoji pvz .

 int a[]={3,5,63,5};

O kaip pirmu atveju?

 

 

Ir dar, kokie tipai yra laikomi baziniai? Nes visur skirtingai rašoma. Pvz short,long - Tinka ar ne?

 

int a[]

 

Taip negalima, reikia būtinai nurodyti masyvo dydį.

O primityvius tipus gali rasti čia.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tai taip ir nsupratau, ar long, short arba unsigned, galima laikyti baziniu tipu? Nes toj lentelej parodyti specifikatoriai...

 

Užmesk akį į dešinį lentelės stulpelį - ten surašyti tikri tipai, gaunami apjungus tai, ką žymi specifikatoriai. Todėl - taip, techniškai tai yra skirtingi tipai.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...