Referencja, wskaźnik znaczenie znaku &
Ostatnio zmodyfikowano 2017-07-06 21:45
Masterpc16 Temat założony przez niniejszego użytkownika |
Referencja, wskaźnik znaczenie znaku & » 2017-07-03 20:30:40 Witam czy dobrze rozumiem że jeśli przed nazwą zmiennej wstawimy znak and (&) to zawsze oznacza to że pobieramy adres w pamięci? int a = 50; int & b = a
int * wsk = & a
|
|
mateczek |
» 2017-07-03 20:43:25 #include <iostream> using namespace std;
int main() { int a = 7; int & b = a; b = 55; cout << a; int * wsk = & a; * wsk = 33; cout << a; } |
|
Masterpc16 Temat założony przez niniejszego użytkownika |
» 2017-07-03 20:49:10 @mateczek trochę spłyciłeś gdzie mowa o adresach ;P |
|
mateczek |
» 2017-07-03 21:02:17 że jeśli przed nazwą zmiennej wstawimy znak and (&) to zawsze oznacza to że pobieramy adres w pamięci? |
nie zawsze. #include <iostream> using namespace std;
int main() { int a = 7; int & b = a; b = 55; cout << a; int * wsk; wsk = & a; * wsk = 33; cout << a; } |
|
pekfos |
» 2017-07-03 21:06:12 Referencja to alias na zmienną. Jeśli referencja występuje jako argument/wartość zwracana funkcji, pole w strukturze, itp - jest to wewnętrznie wskaźnik. Jeśli nie ma takiej potrzeby, referencja nie zostawia po sobie śladu w skompilowanym programie. T & t = t2; g1( t ); g2( t ); jest równoznaczne z ale T & t = f(); g1( t ); g2( t ); nie jest równoznaczne podstawieniu f() w miejsce t, bo funkcja zostałaby wywołana 2 razy, a nie raz. |
|
Masterpc16 Temat założony przez niniejszego użytkownika |
» 2017-07-03 21:11:41 Dzięki wszystkim za odpowiedzi :) |
|
latajacaryba |
» 2017-07-06 14:58:51 skoro autor juz dowiedzial sie czego chcial to pozwolicie, ze zapytam o to, co powiedzial Pekfos: [cytatJeśli referencja występuje jako argument/wartość zwracana funkcji, pole w strukturze, itp - jest to wewnętrznie wskaźnik. Jeśli nie ma takiej potrzeby, referencja nie zostawia po sobie śladu w skompilowanym programie.[/cytat]
1. Wewnetrznie wskaznik? Co miales przez to na mysli?
2. Co znaczy ze nie zostawia po sobie sladu? |
|
jankowalski25 |
» 2017-07-06 19:44:41 1. "Wewnętrznie" oznacza kod niskopoziomowy, na przykład w asemblerze. Kompilator musi jakoś zapisać taką referencję za pomocą zer i jedynek, zwykle najprościej zrobić to tak samo, jak przy wskaźnikach. 2. Optymalizacje mogą usunąć informacje o tym, że autor programu w ogóle użył referencji. Zresztą był podany przykład: T & t = t2; g1( t ); g2( t ); jest równoznaczne z
|
Po prostu w kodzie asemblera może nie być żadnego odpowiednika zmiennej t i w obu przypadkach kod maszynowy może być identyczny. Dopisano:Zresztą, zobacz sam: #include <iostream>
typedef int T;
void g1( T & t ) { std::cout << "g1\n"; }
void g2( T & t ) { std::cout << "g2\n"; }
int main() { T t2; T & t = t2; g1( t ); g2( t ); } 1. Skompiluj za pomocą https://gcc.godbolt.org/ bez żadnych flag. 2. Zobacz, jak została zapisana zmienna t . 3. Dorzuć "-O1" do opcji kompilacji. 4. Teraz zmienna t nie ma swojego odpowiednika w kodzie asemblera. |
|
« 1 » 2 |