Стани премиум член и добиј попуст на 2000+ производи и куп други бенефити!

Прашање C/C++

vojo

read-only
17 јануари 2011
11
4
Здраво на сите...
Значи дадена функција во С++, прима агрумент покажувач
Пр:
___________________________________________________________
#include <iostream>
#include <cmath>

using namespaces std;

float funkcija (float*);

int main()
{
float* pokazuvac = new float;
cout << "Vrednosta e" << funkcija(pokazuvac) << endl;
delete pokazuvac;
return 0;
}

float funkcija (float* a)
{
return (pow(*a,2));
}
_____________________________________________________________

Овде funkcija како аргумент зема покажувач кон некоја динамички алоцирана float променлива. Е сега дали во funkcija покажувачот (а) е истиот покажувач од main или тоа е копија на тој покажувач?
Знам дека доколку функција прима аргументи по вредност, таа си прави копии од аргументите во своите локални променливи, знам и дека ако функцијата прима аргументи по референца, таа практично ги зема адресите на променливите и си работи со истите променливи од main (нема копирање).
 

slobo_n

read-only
25 јуни 2009
40
18
Кога ја повикуваш float funkcija(pokazuvac) се креира копија од поинтерот "pokazuvac" и таа копија му се задава на "а" покажувачот.
Во меморијата "pokazuvac" и "а" живеат на различни адреси, но покажуваат кон истa адреса - таа на динамички креираниот float.

Примеров подолу ти го покажува ова.

Код:
#include <iostream>
#include <cmath>
 
using namespace std;
 
float funkcija (float*);
 
int main()
{
float* pokazuvac = new float;
cout<< "adresa na pokazuvac: "<< &pokazuvac<< endl;
cout<< "pokazuvac pokazuva kon adresa: "<< pokazuvac<< endl;
cout << "Vrednosta e: " << funkcija(pokazuvac) << endl;
delete pokazuvac;
return 0;
}
 
float funkcija (float* a)
{
    cout<< "adresa na a: "<< &a<< endl;
    cout<< "a pokazuva kon adresa: "<< a << endl;
return (pow(*a,2));
}
 

vojo

read-only
17 јануари 2011
11
4
Благодарам на одговорот slobo_n....
Значи у принцип истата работа како и кога на функцијата и задаваш аргументи по вредност. Значи се прават копија од аргументот во локална променлива на функцијата( аргументот т.е променливата и локалната копија имаат иста вредност, но различни адреси), само во овој случај се прави копија од покажувач, кој покажува кон иста адреса како и оној од main, а тие самите се на различни адреси.

Дали овој начин на динамичко алоцирање на меморија е добар?
Имам слушнато за malloc функција... но незнам како да ја користам..дали треба да се вклучи некој посебен хедер?
Прашање до сите се разбира...
Благодарам однапред..
 

slobo_n

read-only
25 јуни 2009
40
18
Благодарам на одговорот slobo_n....
Значи у принцип истата работа како и кога на функцијата и задаваш аргументи по вредност. Значи се прават копија од аргументот во локална променлива на функцијата( аргументот т.е променливата и локалната копија имаат иста вредност, но различни адреси), само во овој случај се прави копија од покажувач, кој покажува кон иста адреса како и оној од main, а тие самите се на различни адреси.
Во конкретниов случај како што го имаше пратено тоа беше сценариото и добро си разбрал.
Инаку мозиш да ги пратиш поинтерите и по референца.
Дали овој начин на динамичко алоцирање на меморија е добар?
Имам слушнато за malloc функција... но незнам како да ја користам..дали треба да се вклучи некој посебен хедер?
Прашање до сите се разбира...
Благодарам однапред..
Во C++ препорачаниот начин на динамичко алоцирање на меморија е со new и ослободување на динамичката меморија со delete. Бидејќи објект кој е алоциран преку new, му се повикува конструкторот, т.е. објектот е креиран прописно. Кога го бришиш динамички креираниот објект пак со delete, се повикува десктрукторот на тој објект и се ослободуваат сите ресурси кои ги држел тој објект - тоа е она што го сакаме.

Ако во C++ креираш објект со malloc и го бришиш со free, ниту констукторот ниту деструкторот ке бидат повикани од тој објект.
Со malloc и free ќе работиш во C, но не во C++.



Мала забелешка на претходниот код, не му имаше зададено вредност на променливата кон која покажува pokazuvac.
Taka да подобро задај му некоја вредност, на пример вака:
float* pokazuvac = new float(5);
 

vojo

read-only
17 јануари 2011
11
4
Во C++ препорачаниот начин на динамичко алоцирање на меморија е со new и ослободување на динамичката меморија со delete. Бидејќи објект кој е алоциран преку new, му се повикува конструкторот, т.е. објектот е креиран прописно. Кога го бришиш динамички креираниот објект пак со delete, се повикува десктрукторот на тој објект и се ослободуваат сите ресурси кои ги држел тој објект - тоа е она што го сакаме.

Добро знам дека намената на С++ е за објектно ориентирано програмирање, јас сеуште ја разгледувам С парцелата во С++. Објектите ако добро се сеќавам се поврзани со класите, или преку нив се служиме за да пристапиме до некоја класа. Во конкретниов случај се работи за обични променливи, полиња и покажувачи кон променливи или полиња. Значи јас во случајов се користам со конструктор и деструктор за креирање и бришење на обични променливи! Ако се сеќавам добро класите беа множество од функции, променливи итн, и тогаш ми има логика да користам конструктор и деструктор за динамичко алоцирање на меморија на објекти, но не и за обични променливи или полиња.
Дали ова значи дека С++ ги гледа сите променливи, полиња итн како објекти? Или објект е вид на променлива од типот на класата која ја користиш во моментот?


Мала забелешка на претходниот код, не му имаше зададено вредност на променливата кон која покажува pokazuvac.
Taka да подобро задај му некоја вредност, на пример вака:
float* pokazuvac = new float(5);

Добро кодот беше поставен чисто онака за илустрација на она што сакав да прашам, ништо корисно не треба да прави и си има пропусти.

Обично имам навика да иницијализирам покажувач на вредност 0 т.е.
*pokazuvac = NULL;

И подоцна да му зададам вредност преку тастарура или слично.

Е сега прашање у прашање
float* pokazuvac = new float(5);
Јас знам дека ако горниов израз има средни загради [], тоа значи дека алоцираш меморија за поле од 6 float променливи, а new враќа покажувач кон првата адреса од тоа поле?
Што значат маливе загради?
Даваш вредност 5 на адресата на која покажува покажувачот?

slobo_n друже благодарам на исцрпните одговори, а и на секој друг што ќе ми одговори на прашањава.
 

slobo_n

read-only
25 јуни 2009
40
18
Добро знам дека намената на С++ е за објектно ориентирано програмирање, јас сеуште ја разгледувам С парцелата во С++. Објектите ако добро се сеќавам се поврзани со класите, или преку нив се служиме за да пристапиме до некоја класа. Во конкретниов случај се работи за обични променливи, полиња и покажувачи кон променливи или полиња. Значи јас во случајов се користам со конструктор и деструктор за креирање и бришење на обични променливи!
Можеби float* pokazuvac = new float(5); ти личи како да користиш конструктор, но не е така. Простите(Int, float, double итн.) типови немаат конструктор/деструктор.
Извини што користев нестандардна синтакса за иницијализирање на float.
Имено во c++ мозиш да иницијализираш обична променлива:
int prvNacin = 5;
int vtorNacin(5);
Првиот начин е стандарден и држи се до него. Вториот е само друг начин за првиот и личи како да користи конструктор - но не користи, и не е баш стандарден
Референца

Ако се сеќавам добро класите беа множество од функции, променливи итн, и тогаш ми има логика да користам конструктор и деструктор за динамичко алоцирање на меморија на објекти, но не и за обични променливи или полиња.
Дали ова значи дека С++ ги гледа сите променливи, полиња итн како објекти? Или објект е вид на променлива од типот на класата која ја користиш во моментот?
Не, примитивните типови и објектите се сосема различни работи.
Е сега прашање у прашање
float* pokazuvac = new float(5);
Ова е само друга форма за
float* pokazuvac = new float;
*pokazuvac = 5;// koristi ja ovaa forma, postandardna e
 

vojo

read-only
17 јануари 2011
11
4
Благодарам друже, ми помогна да разберам некои работи..
Поздрав
 
членови онлајн
мислења
теми
членови

IT.mk/market понуда

Бесплатна достава на 3000 производи
На врв Дно