Wskaźniki a referencja
Ostatnio zmodyfikowano 2013-07-25 16:25
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: #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: cout <<* Wskaznik << endl; cout <<*( & Referencja ) << endl; Dlaczego jednak możemy w przypadku: int & Referencja = Zmienna;
przypisać adresowi zmienną, zaś nie działa to w przypadku: Przecież &Referencja i Wskaznik odpowiadają temu samemu. |
|
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: int a; int * wsk =& a; int & ref = a;
* wsk = 2; ref = 3;
|
|
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:
int & Referencja = Zmienna;
przypisać adresowi zmienną, zaś nie działa to w przypadku:
|
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 . Okropne. |
|
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) |
|
pekfos |
» 2013-07-25 14:11:06 Bo powinno być int main() . |
|
ciekawski Temat założony przez niniejszego użytkownika |
» 2013-07-25 16:07:05 Może jakiś argument za tym przemawiający? |
|
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). |
|
|
DejaVu |
» 2013-07-25 16:25:34 |
|
« 1 » |