pointeri
Last Updated: Dec 08 2019 22:37, Started by
vali38
, Jun 25 2010 18:56
·
0
#181
Posted 18 June 2015 - 17:00
#include <stdlib.h> struct _mere { int pret, cantitate; }; int main() { struct _mere *mar = malloc(sizeof(struct _mere) * 100); size_t i; for (i = 0; i < 100; i++) { mar[i].pret = i; mar[i].cantitate = 2 * i; } free(mar); return 0; } Edited by George-R, 18 June 2015 - 17:01. |
#183
Posted 18 June 2015 - 17:51
Asa fioros arata acel new ca nu te prinzi cum il poti inlocui cu malloc?
|
#184
Posted 06 February 2017 - 22:42
Ups ... Nu m-am uitat la data ultimului post..
Edited by CakeDieNow, 06 February 2017 - 22:50. |
#185
Posted 21 December 2017 - 13:44
msmihai, on 01 iulie 2010 - 19:22, said:
malloc intoarce pointer de tip void*. daca nu ai void* si in stanga , faci cast. asa functioneaza C. Nu este adevarat. MALLOC returneaza void* iar C standard garanteaza ca orice este in stanga lui malloc sa fie implicita convertirea. Asa ca: int *ptr = (int*)malloc ( 5 * sizeof ( *ptr ) );Nu este necesar, ajunge: int *ptr = malloc ( 5 * sizeof ( *ptr ) );Cum spuneam este garantat de Standardul C acest lucru pe langa alte putine lucruri cum ar fi (sizeof char) sau side effects.. Sa se citeasca Standardul C11. Imi cer scuze pentru termenii gresiti in limba romana, insa nu este prima mea limba care o folosesc, cu atat mai mult termanii informatici in Romana. EDIT: A se citii acest LINK de pe StackOverFlow legat de Malloc. Edited by TARA24, 21 December 2017 - 14:00. |
#186
Posted 21 December 2017 - 14:10
#187
Posted 21 December 2017 - 15:30
TARA24, on 21 decembrie 2017 - 13:44, said:
Nu este adevarat. MALLOC returneaza void* iar C standard garanteaza ca orice este in stanga lui malloc sa fie implicita convertirea. Asa ca: int *ptr = (int*)malloc ( 5 * sizeof ( *ptr ) );Nu este necesar, ajunge: int *ptr = malloc ( 5 * sizeof ( *ptr ) );Cum spuneam este garantat de Standardul C acest lucru pe langa alte putine lucruri cum ar fi (sizeof char) sau side effects.. Sa se citeasca Standardul C11. Imi cer scuze pentru termenii gresiti in limba romana, insa nu este prima mea limba care o folosesc, cu atat mai mult termanii informatici in Romana. EDIT: A se citii acest LINK de pe StackOverFlow legat de Malloc. Ca si la postul despre comprimarea unui sir prin eliminarea unor elemente, nu folosirea limbii romane genereaza probleme (care este una de forma) ci continutul (care de fapt este fondul). Tu realizezi ca raspunzi la un mesaj din 2010 cu un link la un draft pt C standard din 12 aprilie 2011? Nu mai intru in detalii despre cate compilatoare au implementat 100% macar standardele C99. |
#188
Posted 04 November 2018 - 15:09
Imi confirma si mie cineva, va rog ca asta este corect? Sunt in dubi.
int a = 10; int *p = &a; cout << p << endl; cout << *p << endl; cout << &p << endl; Unde se afla adresa lui a? in *p sau in p? Eu cred ca atunci cand dau cout<< p mi se afiseaza adresa la care este stocata variabila p care contine adresa lui a, corect? Deci asta inseamna ca cout<< &p imi arata de fapt adresa lui a. *p afiseaza valoare ce se afla la adresa continuta de p. Este corect? |
#189
Posted 04 November 2018 - 15:14
Nu
a = un numar: 10 &a = un numar: adresa lui a. p = un numar: adresa lui a. *p = un numar: a (10) &p = un numar: adresa lui p Edited by dani.user, 04 November 2018 - 15:14. |
#190
Posted 08 December 2019 - 21:15
Nu inteleg unele lucruri in cod.Deci codul asta copiaza elementele primului vector in al doilea vector.Incerc sa-l inteleg.
int v1[10], v2[10]; // se declara 2 pointeri cu 10 elemente intregi. int *ip1, *ip2 = &v2[0]; // se declara un pointer ip1 si un pointer ip2 care pointeaza catre primul element al vectorului 2, nu? int *ep = &v1[10]; // pointerul ep pointeaza catre ultimul element din primul vector, nu? for(ip1=&v1[0]; ip1 < ep; ++ip1) // deci se parcurge vectorul v1.Pointerul ip1 retine adresa primului element din v1 si pointeaza catre casuta unde se afla primul element.Deci in ip1 se duce adresa, de ce nu se duce valoarea? Mai departe ip1<ep (ip1<adresa ultimului element sau ip1<valoarea ultimului element?), ++ip(la fel, marim valoarea sau adresa c-o unitate?) { *ip2 = *ip1; // in pointerul 2 se duc pe rand elementele vectorului 1, nu? ++ip2; // ip2 ce rol are? initial pointeaza catre prima valoare a celui de-al doilea vector, apoi se mareste c-o unitate, dar ce se mareste? valoarea sau adresa? }Sunt confuz putin. |
|
#191
Posted 08 December 2019 - 21:46
Nu declari pointeri cu 10 elemente întregi, declari vectori.
v1 are doar zece elemente, v1[0], v1[1], ..., v1[8], v1[9], 9-0+1 = 10. Adică &v1[10] este adresa după ultimul element din vector. ep indică prima adresă după vectorul v1. Dacă nu folosești operatorul * (deferențiere) pe un pointer, lucrezi cu adresa. Adică ip1 < ep compară adresele și ++ip1 și ++ip2 incrementează adresele. Pointer fără * -> lucrezi cu adresa. Pointer cu * -> lucrezi cu valoarea aflată la adresa către care pointează pointer-ul. Valoarea unui pointer este o adresă! Edited by tavitu, 08 December 2019 - 21:46. |
#192
Posted 08 December 2019 - 21:51
int v1[10], v2[10]; - vectori, nu pointeri (vectorii "decay" in pointeri in unele situatii cand daca zici v1 poate intelege un pointer la adresa primului element din vector)
ip1 e pointer, tine mereu o adresa, nu valoarea de la acea adresa. Iti imaginezi ca ai o biblioteca plina de carti iar pointeru e o pozitie din acea biblioteca, nu o carte in sine. ep - pointeaza dupa ultimul element din vector |
#193
Posted 08 December 2019 - 22:37
Scurt intro:
Confuzia este normala mai ales atunci cand studiezi C-ul pe sarite, de pe diferite tutoriale de pe Net, si nu ai "imaginea de ansamblu" inainte de apucat studiul pointerul. Problema ta imi aminteste de faptul ca este obligatoriu ca inainte de studiul pointerilor, trebuiesc intai cunoscute mecanismele de baza pentru: functionarea memeoriei ce se intampla la nivelul celulei RAM atunci cand se fac operatii pe o singura valoare cum este formata o celula RAM(asamblul de bistabili) cum functioneaza stiva de instructiuni a microprocesorului pt operatii elementare cu o singura valoare pe o celula RAM codul necesar in Assembly pt operatiile elementare pe o singura valoare in celula RAM cum se mapeaza memoria RAM si de abia apoi se intra in studiul pointerilor in C. C-ul este limbaj facut de specialisti pt specialisti si nu pt publicul general (asa cum sunt realizate alte limbaje programare) Problema ta: Quote
int v1[10], v2[10]; // se declara 2 pointeri cu 10 elemente intregi. iar fiecare adresa de memmorie nu indica momentan catre nici o valoare. Quote
int *ip1, *ip2 = &v2[0]; // se declara un pointer ip1 si un pointer ip2 care pointeaza catre primul element al vectorului 2, nu? int *ip1 => se rezerva o alta zona in memorie care este identificabila prin adresa &ip1 si indica(dereferentiaza) catre valoarea *ip1 Valoarea adresei &ip1 nu este cunoscuta direct de programator insa poate fi aflata la runtime si tot timpul este diferita pt fiecare rulare a programului (adica valoarea adresei &ip1 este posibil ca la fiecare rulare sa fie alta => doarece alocareea se face aleatoriu de fiecare data, adica iti rezerva alte locatie acolo unde are loc, doarece RAM = RANDOM accesss memory => vezi cum functioneaza memoria RAM si controllerul acesteia) *ip2 = &v2[0]; se rezerva o alta zona in memorie care este identificabila prin adresa &ip2 si care stocheaza nu informatia utila(payload-ul) ci valoarea unei alte adrese de memorie si anume adresa lui v2[0] Nu exista in limba romana cuvantul a "pointa" ci cuvantul a dereferentia. Quote
int *ep = &v1[10]; // pointerul ep pointeaza catre ultimul element din primul vector, nu? mai pe scurt: pointerul ep dereferentiaza catre ultima adresa a ultimului element. Quote
for(ip1=&v1[0]; ip1 < ep; ++ip1) // deci se parcurge vectorul v1.Pointerul ip1 retine adresa primului element din v1 si pointeaza catre casuta unde se afla primul element.Deci in ip1 se duce adresa, de ce nu se duce valoarea? Mai departe ip1<ep (ip1<adresa ultimului element sau ip1<valoarea ultimului element?), ++ip(la fel, marim valoarea sau adresa c-o unitate?) { ip1 dereferentiaza intotdeauna catre o alta a adresa de memorie si nu catre informatia utila, Adica mai exact , valoarea pe care o stocheaza ip1 este de genul 0x7fffa0757dd49(adica valoarea unei alte adrese) si nu catre informatia utila(payloadul) pt programator.Cum ar fi de exemplu valoare 10. Quote
*ip2 = *ip1; // in pointerul 2 se duc pe rand elementele vectorului 1, nu? la nivel de cod Assembly are loc o copiere a informatiei utile (vezi codul generat in assembly) zonei respective Quote
++ip2 Desi suntetm tentati sa zicem ca are o incrementare(++) de fapt nu are loc o operatie in sens strict matematic in contextul aritmeticii poointerilor.La nimic nu se aduna "+1" ci de fapt in acest context are loc selectia sau saltul, catre urmatoarea adresa de memorie valida in cadrul zonei de memorie alocata consecutiv de 10 adrese de memorie. Deci acea incrementare de "+1" in acest context semnifica de fapt "salt la urmatoarea adresa". Daca esti curios distanta dintre doua adrese de memorie consecutive este in cazul tau sizeof(int). Asta inseamna ca daca adresa de memorie curenta este 0x7fffa0757dd4, urmatoarea adresa de memoriei se va afla la o distanta de sizeof(int) bytes. In fond atunci cand vorbim de memorie, acel "++" inseamna salt la urmatoarea adresa care se va afla la o distanta de sizeof(int) (in acest caz) fata de adresa curenta. Quote
ip2 ce rol are? Imagineaza-ti ca ai o biblioteca. Fiecare raft reprezinta un loc unde pui informatia utila. Aceste rafturi au denumiri: raftul 1, raftul 2, raftul 3,... iar raftul de baza se afla la baza bibliotecii cu adresa &ip2 atunci "++ip2", sare la raftul urmator unde depune continutul venit de la adresa curenta a lui ip1, adica de la &ip1, care la randul lui incrementeaza biblioteca cu rafturi a lui ip1 tavitu, on 08 decembrie 2019 - 21:46, said:
Pointer fără * -> lucrezi cu adresa. Pointer cu * -> lucrezi cu valoarea aflată la adresa către care pointează pointer-ul. Exista doar adresa pointerului = &p si valoarea pointerului = *p spre care dereferentiaza &p In limbajul tehnic al specialistilor in software nu exista termenul de "pointeaza" ci notiunea de dereferntiere dani.user, on 08 decembrie 2019 - 21:51, said:
int v1[10], v2[10]; - vectori, nu pointeri dpdv al pointerilor, "vectorii" reprezinta modul abstract de ordonare a unei gandiri insa in realitate ei nu exista. Exista insa segmente consecutive de memorie.O da, alaea chiar exista in realitate |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users