Wątek zablokowany 2015-07-13 22:18 przez somekind.

Wskazniki czym sie rozni ten zapis

0
Ten 
int *wskaznik;
int zmienna = 10;
*wskaznik=zmienna;
od tego 
int *wskaznik = &zmienna ;  Procz tego ze tutaj odrazu pokazalismy na co pokazuje wskaznik.

 

Mimo wszystko *wskaznik=zmienna mam to rozumiec jako zapis int *wskaznik = &zmienna ? oba zapisy pokazuja to samo.

2
int *wskaznik;
int zmienna = 10;
*wskaznik=zmienna;
  1. deklarujesz wskaźnik
  2. deklarujesz zmienną
  3. tam gdzie wskazuje wskaźnik przypisujesz (kopiujesz) wartosc zmiennej z punktu 2. Zauważ, że wskaźnik w tym przypadku wskazuje na nie-wiemy-co więc taki zapis to UB.
int *wskaznik = &zmienna

tutaj deklarujesz wskaźnik, który wskazuje na zmienną zmienna
taki zapis dokładnie odpowiada czemuś takiemu:

int *wskaznik;
wskaznik = &zmienna;
0

Jeszcze jedno pytanie z innej beczki jak mam rozumiec l-wartosc ? (po lewej stronie moga stac tylko zmienne a nie wartosci liczbowe ? )

3

l-value to wszystko to, co możesz postawić po lewej stronie znaku przypisania.
Dla przykładu:
4 = jakas_funkcja_zwracajaca_inta() jest bez sensu, to chyba oczywiste. Liczby nie są jednak jedynym przykładem.
int piec() { return 5; }
w takim przypadku piec() też nie jest l-value. No i sporo innych przykładów by się znalazło.

r-value to natomiast wszystko, albo prawie wszystko. C++11 troche skomplikował te pojęcia, natomiast dla początkującego (chyba takim jesteś) to w zupełności wystarczy.
l-value można pojmować również tak, że są to wszystkie (prawie wszystkie?) obiekty, które nie są wyrażeniem tymczasowym i posiadają zarezerwowane miejsce w pamięci.

0

To moze jeszcz jedno pytanko jak mam takie cos

int *a,*b;
a=b;  // Teraz a pokazuje na to co wskaznik b ? a czemu nie robi sie tu tak jak przy zmiennych a=&b;
 

Juz chyba wiem bo wskaznika sam w sobie jest zmienna ktora przechowuje (adres innej zmiennej) dlatego nie trrzeba ampersanda ?:D

0
 a=b 

kopiujesz wartość wskaźnika(czyli adres w pamięci) b do wskaźnika a, wtedy a i b wskazują na to samo miejsce w pamięci.

 a=&b

użycie & powoduje pobranie adresu zmiennej b i przypisanie go do a, czyli wskaźnik a wskazuje wtedy na miejsce w pamięci gdzie znajduje się wskaźnik b, a nie na wartość wskazywaną przez wskaźnik b.

3

@Marcin5565: no nie do końca tak jest
@balti: wskaznik sam w sobie jest zmienna ktora przechowuje adres innej zmiennej dokładnie tak.
a = b zadziała dokładnie tak, jak zadziałałoby jakis_int_1 = jakis_int_2, czyli wartość zmiennej b zostanie skopiowana do zmiennej a. W przypadku wskaźników, ową wartością jest miejsce w pamięci, na które wskaźnik wskazuje. Zatem po wykonaniu tej operacji, wskaźnik a będzie wskazywał tam, gdzie wskaźnik b.

a = &b no to nie zadziała. Zapis *wskaznik powoduje "dojście" do miejsca, na które ten wskaźnik wskazuje, natomiast zapis &dowolna_zmienna powoduje wyłuskanie adresu w pamięci, pod którym ta zmienna się znajduje. Oczywiście - wskaźnik jak każda inna zmienna l-value jest gdzieś w pamięci komputera, zatem możliwe jest pobranie adresu tej pamięci. Zatem tutaj (a = &b) chcesz do zmiennej, która przechowuje adres inta przypisać adres wskaźnika. To oczywiście błąd i to się nie skompiluje.

int **a, *b;
a = &b;

No i teraz jest fajnie, bo a jest zmienną, która przechowuje adres wskaźnika (jest wskaźnikiem na wskaźnik), więc taki adres (adres wskaźnika b) możemy do zmiennej a przypisać.

0
balti napisał(a):
Ten 
int *wskaznik;
int zmienna = 10;
*wskaznik=zmienna;
od tego 
int *wskaznik = &zmienna ;  Procz tego ze tutaj odrazu pokazalismy na co pokazuje wskaznik.

 

Mimo wszystko *wskaznik=zmienna mam to rozumiec jako zapis int *wskaznik = &zmienna ? oba zapisy pokazuja to samo.

takie coś: *wskaźnik to tzw. wyłuskanie wskaźnika, czyli już zmienna (żywa), nie wskaźnik;

dlatego też zapis typu:
int *w;
// i od razu:
*w = x;

jest błędem, ponieważ w nie był zainicjowany, zatem nie adresuje niczego - żadnej zmiennej... lecz losowy obszar ramu.
zwykle taki kod daje error: access violation...
o ile mamy szczęście, bo w innych przypadkach, takim przypisaniem, zniszczymy jakieś swoje dane,
co zwykle potem trudno wykryć.

int *w = new int [500]; // to jest przydzielenie nowego obszaru pod adres w.

// i teraz:
*w = x; // to samo co: w[0] = x
jest OK.

w[499] = 7; // też OK, bo w wskazuje na obszar od 0 do 499, a nie tylko na jeden int.

takie coś:

int *w = new int; // przydzielamy tylko 1 int

też jest formalnie OK, no ale w praktyce nigdy takich pierdół się nie robi,
bowiem alokowanie tylko jednej sztuki to czyta głupota...
bo w takim przypadku po prostu wystarczy zdefiniować wprost - zmienną!

int w;

0

`int *w = new int [500]; // to jest przydzielenie nowego obszaru pod adres w.

// i teraz:
w = x; // to samo co: w[0] = x
jest OK.`

omójboże.

edit:
*wskaźnik to tzw. wyłuskanie wskaźnika, czyli już zmienna (żywa), nie wskaźnik; kolejna głupota

0
pingwindyktator napisał(a):

`int *w = new int [500]; // to jest przydzielenie nowego obszaru pod adres w.

// i teraz:
w = x; // to samo co: w[0] = x
jest OK.`

omójboże.

edit:
*wskaźnik to tzw. wyłuskanie wskaźnika, czyli już zmienna (żywa), nie wskaźnik; kolejna głupota

tam jest: *w = x, a nie samo: w = x;

a dwa: operator '*' (jednoargumentowy i prefixowy to dereferencja, która po polsku nazywa się wyłuskaniem.

No, najwyraźniej musicie się sporo douczyć dzieci... pomimo wakacji, albowiem:
gdy ma się niedouczonych nauczycieli, trzeba się wówczas uczyć samemu, i w wolnym czasie, właśnie!

0

Primo: tam jest: *w = x, a nie samo: w = x;
ja tam nie widze gwiazdki. A chyba taki advanced programmer jak ty powinien ogarniać niby-htmlowe trywialne znaczniki <code>. Czy jednak nie?

Secundo: *wskaźnik to tzw. wyłuskanie wskaźnika, czyli już zmienna (żywa), nie wskaźnik jak mam int *******bit_to_baran to *bit_to_baran nie jest wskaźnikiem?

Tertio: spadaj stąd, koleś.

0
pingwindyktator napisał(a):

Primo: tam jest: *w = x, a nie samo: w = x;
ja tam nie widze gwiazdki. A chyba taki advanced programmer jak ty powinien ogarniać niby-htmlowe trywialne znaczniki <code>. Czy jednak nie?

Ja tam widzę jak byk, co prawda jakąś kropę, zamiast gwizdy,
no, a to jest dzieło tych twoich... guru zapewne, bo hetemelowych programistów, czyli inaczej niedzielnych.

pingwindyktator napisał(a):

Secundo: *wskaźnik to tzw. wyłuskanie wskaźnika, czyli już zmienna (żywa), nie wskaźnik jak mam int *******bit_to_baran to *bit_to_baran nie jest wskaźnikiem?
Tertio: spadaj stąd, koleś.

Bredzisz synu.
możesz obie to nazwać jak chcesz, m.in.:
*fjut_to_ciul_bogus_dogma;

a to i tak będzie wyłuskaniem adresu, czyli efektywnie zmienną.
No a to że bit nie ma efektywnego adresu w obecnych pecetach, to już twój prywatny problem -
bezpośrednia konsekwencja zwyczajnego nieuctwa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1