Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cu ce va aparati de cainii agresi...

Nu imi platiti coletul cu cardul ...

Mi-au disparut amigdalitele ?

Exista vreun plan de terorizare p...
 Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone

Monede JO 2024

Suprasolicitare sistem electric
 CIV auto import

Mutare in MOZAMBIC - pareri, expe...

Scoatere antifurt airtag de pe ha...

Magnet in loc de clește pent...
 Cumparat/Locuit in apartament si ...

Pot folosi sistemul PC pe post de...

Sokol cu distorsiuni de cross-over

Filtru apa potabila cu osmoza inv...
 

pointeri

- - - - -
  • Please log in to reply
192 replies to this topic

#181
George-R

George-R

    New Member

  • Grup: Junior Members
  • Posts: 7
  • Înscris: 10.06.2015
#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.


#182
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,235
  • Înscris: 11.04.2006
removed  :)

Edited by andreim77, 18 June 2015 - 17:19.


#183
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
Asa fioros arata acel new ca nu te prinzi cum il poti inlocui cu malloc?

#184
CakeDieNow

CakeDieNow

    Junior Member

  • Grup: Members
  • Posts: 57
  • Înscris: 28.09.2016
Ups ... Nu m-am uitat la data ultimului post..

Edited by CakeDieNow, 06 February 2017 - 22:50.


#185
TARA24

TARA24

    New Member

  • Grup: Junior Members
  • Posts: 11
  • Înscris: 20.12.2017

View Postmsmihai, 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
TARA24

TARA24

    New Member

  • Grup: Junior Members
  • Posts: 11
  • Înscris: 20.12.2017

View Postgnomemory, on 01 iulie 2010 - 20:08, said:

printf("%d\n", y); /* Adresa lui x de pe stack */
printf("%d\n", &y); /* Adresa lui y de pe heap */


Gresit, corect este %p si este neaparat necesar cast (void*):
printf("Adresa lui Y = %p\n", (void*)y);


Edited by TARA24, 21 December 2017 - 14:14.


#187
Cy_Cristian

Cy_Cristian

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 22.02.2009

View PostTARA24, 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
g0dafk

g0dafk

    Member

  • Grup: Members
  • Posts: 462
  • Înscris: 10.11.2016
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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
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
tutuN_

tutuN_

    Junior Member

  • Grup: Members
  • Posts: 137
  • Înscris: 21.09.2014
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
tavitu

tavitu

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Înscris: 16.02.2009
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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
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
MartinAdelberg

MartinAdelberg

    Member

  • Grup: Members
  • Posts: 866
  • Înscris: 23.08.2019
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.
Se declara  alocate in memorie doua segmente de memorie , unde fiecare segment de memorie este reprezentat de alocarea consecutiva a cate 10 adrese de memorie,
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?
Nu chiar.
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?
pointerul ep derefentiaza catre o valoare care nu contine payload ci o alta adresa , respectiv adresa ultimul element.
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 parcurge segmentul consecutiv al memoriei plecand de la adresa primul element pana la adresa ultimului element.
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?
se copiaza  informatia utila din zona de memorie identificabila la adresa &ip1 catre zone de memorie indentficabila la adresa &ip2
la nivel de cod Assembly are loc o copiere a informatiei utile (vezi codul generat in assembly) zonei respective

Quote

++ip2
Mare atentie aici.Foarte mare atentie la operatorii ++ si -- in contextul aritmeticii pointerilor.
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?
salt la urmatoarea adresa.
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

View Posttavitu, 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.
Nu exista per-se notiunea de "pointer fara" si "pointer cu"

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

View Postdani.user, on 08 decembrie 2019 - 21:51, said:

int v1[10], v2[10]; - vectori, nu pointeri
segmente consecutive de memorie alocate a caror  baza o reprezinta adresa &v1 respectiva &v2, si nu  "vectori"
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

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate