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

Wskaźniki a referencja

Ostatnio zmodyfikowano 2013-07-25 16:25
Autor Wiadomość
ciekawski
Temat założony przez niniejszego użytkownika
Wskaźniki a referencja
» 2013-07-24 23:15:53
Witam,
staram się właśnie zrozumieć istotę wskaźników i referencji. W tym celu kompiluje kod:

C/C++
#include<conio.h>
#include<iostream>

using namespace std;

void main()
{
    int Zmienna;
    int & Referencja = Zmienna;
    int * Wskaznik;
    Wskaznik = & Zmienna;
    Zmienna = 1;
   
    cout << Zmienna << endl;
    cout <<* Wskaznik << endl;
    cout <<& Referencja << endl;
    cout <<*( & Referencja ) << endl;
    cout << Wskaznik << endl;
    getch();
}
W tym przypadku:
Zmienna - ma jakąś wartość należącą do typu int (nawet konkretnie 1),
Wskaznik - odpowiada adresowi w pamięci (u mnie 0024FB20),
*Wskaznik - odwołuje się do adresu pamięci i wywołuję zmienną Zmienna, która jest tam zapisana,
&Referencja - także odpowiada adresowi w pamięci (0024FB20),

Odwołać do zmiennej poprzez jej adres możemy na dwa sposoby:
C/C++
cout <<* Wskaznik << endl;
cout <<*( & Referencja ) << endl;


Dlaczego jednak możemy w przypadku:
C/C++
int & Referencja = Zmienna;
przypisać adresowi zmienną, zaś nie działa to w przypadku:
C/C++
Wskaznik = Zmienna;

Przecież &Referencja i Wskaznik odpowiadają temu samemu.


P-88716
Mrovqa
» 2013-07-25 00:09:32
Pomyliło ci się coś. Jednoargumentowy operator & jest odpowiedzialny za pobranie adresu. Dopiero gdy w definicji typu użyjesz & to jest to referencja:
C/C++
int a;
int * wsk =& a; // &a - pobrany adres zapisany do wskaznika, ktory przechowuje adresy ze swojej natury
int & ref = a; // ref - referencja

* wsk = 2; // a = 2
ref = 3; // a = 3
 
P-88720
Monika90
» 2013-07-25 00:45:49
Referencja to nowa nazwa dla już istniejącego obiektu. A wskaźnik to obiekt, który przechowuje adres jakiegoś obiektu albo NULL.

Dlaczego jednak możemy w przypadku:
C/C++
int & Referencja = Zmienna;
przypisać adresowi zmienną, zaś nie działa to w przypadku:
C/C++
Wskaznik = Zmienna;
To pierwsze, to nie jest przypisanie, to jest inicjalizacja. Należy to rozumieć: od teraz zmienna
Zmienna
 ma dodatkową nazwę
Referencja
. Masz dwie nazwy, które odnoszą się do tego samego obiektu (zmiennej). Wszelkie operacje, które wykonasz na
Referencja
, będą miały dokładnie taki sam efekt jakbyś je wykonał na
Zmienna
 i na odwrót.

A to drugie to jest przypisanie i jest to błąd typu, bo
Wskaznik
 jest typu
int *
, a
Zmienna
 typu
int
.

void main()
Okropne.
P-88723
ciekawski
Temat założony przez niniejszego użytkownika
» 2013-07-25 03:11:53
@Mrovqa - to wiele wyjaśnia.

@Monika90 - dzięki za wyjaśnienie.

Musze jeszcze poczytać na ten temat to zapewne lepiej to zrozumiem.


BTW Monika90 Czemu
void main()
 jest Twoim zdaniem okropny? (chociaż coś może w tym być bo gdy wcześniej używałem DevC++, nie chciał mi kompilować kodu gdy używałem voida)
P-88727
pekfos
» 2013-07-25 14:11:06
Bo powinno być
int main()
.
P-88747
ciekawski
Temat założony przez niniejszego użytkownika
» 2013-07-25 16:07:05
Może jakiś argument za tym przemawiający?
P-88760
Elaine
» 2013-07-25 16:22:35
3.6.1/2:
An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both
— a function of () returning int and
— a function of (int, pointer to pointer to char) returning int
as the type of main (8.3.5).
P-88762
DejaVu
» 2013-07-25 16:25:34
http://forum.warsztat.gd​/index.php?topic=8435.0

Jeden temat = jeden problem. Skoro zaczynasz dyskusję o innych sprawach to główny wątek uważam za zakończony i temat zamykam.
P-88763
« 1 »
  Strona 1 z 1