Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Referencja, wskaźnik znaczenie znaku &

Ostatnio zmodyfikowano 2017-07-06 21:45
Autor Wiadomość
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?
C/C++
int a = 50;
int & b = a // do adresu w pamięci zmiennej b przypisujemy wartość a

int * wsk = & a // do wskaźnika przypisujemy adres w pamięci zmiennej a
P-163008
mateczek
» 2017-07-03 20:43:25
C/C++
#include <iostream>
using namespace std;

int main() {
    int a = 7;
    int & b = a; // b jest referencją do zmiennej a
    b = 55;
    cout << a;
    int * wsk = & a; //wskaźnik wsk ustawiamy na zmienną a
    * wsk = 33;
    cout << a;
}
P-163011
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
P-163012
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.
C/C++
#include <iostream>
using namespace std;

int main() {
    int a = 7;
    int & b = a; // "b" to referencja do zmiennej "a", Do referencji nie można przypisywać, tylko zaincijalizować.
    b = 55;
    cout << a;
    int * wsk; //deklaracja wskaźnika do zmiennej typu int
    wsk = & a; //operator &(operator wyłuskania adresu)od tej pory "wsk" będzie pokazywał na zmienną "a"
    //wskaźnik można ustawiać do woli
    * wsk = 33;
    cout << a;
}
P-163013
pekfos
» 2017-07-03 21:06:12
Referencja to alias na zmienną.
C/C++
int & b = a; // 'b' to inna nazwa zmiennej 'a'
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.
C/C++
T & t = t2;
g1( t );
g2( t );
jest równoznaczne z
C/C++
g1( t2 );
g2( t2 );
ale
C/C++
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.
P-163014
Masterpc16
Temat założony przez niniejszego użytkownika
» 2017-07-03 21:11:41
Dzięki wszystkim za odpowiedzi :)
P-163015
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?
P-163060
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:
C/C++
T & t = t2;
g1( t );
g2( t );
jest równoznaczne z
C/C++
g1( t2 );
g2( t2 );
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:
C/C++
#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.
P-163067
« 1 » 2
  Strona 1 z 2 Następna strona