• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++, wskaźniki i modyfikator const

Object Storage Arubacloud
+2 głosów
1,474 wizyt
pytanie zadane 15 lutego 2018 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

Witam, uczę się z książki i jestem na etapie modyfikatora const i jego współdziałaniu ze wskaźnikami, rozumiem takie rzeczy:

int a = 10;
const int *pt = &a; //ok
*pt = 10; //źle
int b = 11;
int * const pt2 = &b;
*pt2 = 1; //ok
pt2 = &a; //źle

Rozumiem też zasadę mieszania wskaźników na const i nie const:

//dobrze
int a = 10;
int *pt = &a;
const int *pt2 = pt;

//źle
const int **wsk = &pt;
//wiem że to zależy od tego czy jest tylko jeden poziom przekierowywania czy więcej 

Nie mam jednak pojęcia jak rozumieć to:

Pierwszą część rozumiem, ale to:

Adres danej nie-const można przypisać tylko wskaźnikowi nie-const.

 Jakim cudem?!

Przecież gdyby to była prawda to takie coś było by błędem:

int x = 666; // nie-const
const int *pt = &x; //wskaźnik na obiekt danych const 

Takie coś jest możliwe...

Może coś ja źle rozumiem, już dwa dni analizuje te sprawy ze wskaźnikami i const. Już mam tak tego dość że bierze mnie ochotę rzucić c++ i te wszystkie wskaźniki i zabrać się za JavaScript lub C#... crying . Dziękuje za pomoc i pozdrawiam

 

4
komentarz 15 lutego 2018 przez the_danger Gaduła (4,800 p.)

Nie mam jednak pojęcia jak rozumieć to:

 

Wina słabego tłumaczenia. Tu ten sam fragment z oryginału:

You can assign the address of either const data or non- const data to a pointer-to- const , provided that the data type is not itself a pointer, but you can assign the address of non-const data only to a non- const pointer.

2
komentarz 15 lutego 2018 przez Jakub 0 Pasjonat (23,120 p.)

Ale dalej dziwnie brzmi ta druga część:

you can assign the address of non-const data only to a non- const pointer.

Czyli dalej wnioskuje z tego że mogę przypisać adres danych nie będących tylko do odczytu (nie const) tylko do wskaźnika na dane nie const. A to wydaje mi się sprzeczne...

2
komentarz 15 lutego 2018 przez Patrycjerz Mędrzec (192,320 p.)

Też dołączam się do pytania. Przecież kod

int i;
int* const w = &i;

się bez problemu wykona, a przecież to właśnie mówi ten fragment.

Może jest to wina mojego złego rozumienia słów non-const lub dziwnej konstrukcji zdaniowej tego cytatu, nie wiem.

Jakub, non-const pointer wg mnie oznacza niestały wskaźnik, nie zaś wskaźnik na nie-stałą. To dwie różne rzeczy.

komentarz 15 lutego 2018 przez Jakub 0 Pasjonat (23,120 p.)
To jednak dziwna sprawa bo o wskaźnikach stałych (nie wskaźnikach na stałą) książka mówi dopiero kilka akapitów potem...

1 odpowiedź

+2 głosów
odpowiedź 15 lutego 2018 przez mokrowski Mędrzec (155,460 p.)

1. Po pierwsze słowo const w języku C/C++ (na Twoim etapie nauki), traktuj jako "tylko do odczytu".

2. Po drugie traktuj wskaźnik jako sposób dostępu do danych. Co oznacza np. że "przez ten wskaźnik dostanę się do danych tylko w trybie do odczytu bo wskazuje na dane które są const". Co tłumaczy twoje pytanie dlaczego to: 

int x = 666; // nie-const
const int *pt = &x; //wskaźnik na obiekt danych const 

.. jest poprawne bo określa że do danych z użyciem wskaźnika pt, dostaniesz się tylko do odczytu bo jego definicja wskazuje na dane niezmieniane.

3. Jako ostatnie, czytaj tego typu definicje od prawej do lewej:

    int z = 0;
    int * const pt = &z; // "pt jest stałym (const)  wskaźnikiem (*) na zmienialne typu int" 
    int const * pz = &z; // "pz jest zmienialnym wkaźnikiem (*) na stałe dane typu int"
    int const * const pq = &z; // "pq jest stałym (const) wkaźnikiem (*) na stałe (const) dane typu int"

PS. Dodasz do tego jeszcze volatile i będziesz mógł uzyskać ciekawe konstrukcje.

komentarz 19 lutego 2018 przez Hiskiel Pasjonat (22,830 p.)
A co daje volatile? Słyszałem, że nie mam po co się tym interesować, ponieważ do się przydaje do mikrokontrolek czy coś tam.
komentarz 21 lutego 2018 przez Knayder Nałogowiec (37,640 p.)
volatile wymusza sprawdzanie za każdym razem pamięci, czy aby na pewno zmienna się nie zmieniła. Normalnie jest to optymalizowane. Program wie, że linijkę wyżej użyłeś zmiennej i od tamtej zmienna nie mogła sie zmienić. Mogła być jednak edytowana przez coś innego.

Podobne pytania

0 głosów
1 odpowiedź 593 wizyt
pytanie zadane 19 grudnia 2018 w C i C++ przez kamyk2 Początkujący (420 p.)
+1 głos
1 odpowiedź 113 wizyt
pytanie zadane 26 czerwca 2017 w C i C++ przez interderabilja Początkujący (320 p.)
0 głosów
0 odpowiedzi 163 wizyt
pytanie zadane 15 marca 2016 w C i C++ przez falauthy Stary wyjadacz (11,550 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...