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

Wskazniki - C++

Object Storage Arubacloud
0 głosów
335 wizyt
pytanie zadane 2 lipca 2022 w C i C++ przez polandonion Mądrala (7,040 p.)
edycja 2 lipca 2022 przez polandonion

Witam,

pozno troche, ale mam pytanko:

#include <iostream>
using namespace std;
int main(){
    char a[]="Ala ma kota";
    char* b="Ala ma kota";
    //int *wsk=100;
    cout<<a<<'\n';
    cout<<b<<'\n';
    //cout<<wsk;
    return 0;
}

Jak widac 6. oraz 9. linie kodu dalem w komentarze, bo kompilator glupieje, i slusznie.

4. linia kodu jest jak najbardziej logiczna, bo mamy tablice char'ow, czyli jeden za drugim jakis znak w tablicy, ale:

Totalnie błędna byłaby sytuacja, kiedy chcemy nadać zmiennej wskaźnikowej określoną wartość, bez wcześniejszego przypisania wskaźnika do zmiennej.

Wlasnie zacytowalem slowa pewnego kursanta jezyka C++. Slowa te pochodza ze strony p-programowanie.pl. Natomiast w 5. linii kodu widzimy wlasnie pusty wskaznik (bo nie ma odwolania do zadnej zmiennej typu char), do ktorego wpisalem "Ala ma kota". Ten wskaznik nie odwoluje sie do zadnej zmiennej,a to oznacza, ze ten program nie powinien dzialac.

Dodatkowo jesli mialbym np. wskaznik:

int *wsk;

to ten wskaznik moze wskazywac tylko i wylacznie na zmienna typu int, a co my widzimy w przypadku, ktory przed chwila przytoczylem? Nie dosc, ze wskaznik nie wskazuje na inna zmienna, to przechowuje nie ten typ danych co potrzeba, bo "Ala ma kota" to raczej tablica char'ow, a nie char.

Wiem, ze w C++ mozna to zastapic (a nawet trzeba, bo kompilator daje ostrzezenie) string'ami, ale jednak... potrzebowalbym kogos, kto mi to dosadnie wytlumaczy. Tylko ten przypadek uzycia wskaznika.

Dziekuje i dobranoc.

komentarz 2 lipca 2022 przez Oscar Nałogowiec (29,320 p.)

Wyrwałeś zdanie z kontekstu:

Przed zapisaniem wartości do wskaźnika, czyli zapisaniu wartości do zmiennej na którą wskazuje wskaźnik, należy się upewnić, że wskaźnik nie jest pusty.

Totalnie błędna byłaby sytuacja, kiedy chcemy nadać zmiennej wskaźnikowej określoną wartość, bez wcześniejszego przypisania wskaźnika do zmiennej.

int *wsk;
*wsk = 666; //źle!!

Tu chodziło o zapis "pod zmienną wskaźnikową", czyli zapis w miejsce wskazywane przez wskaźnik. Tego nie należy robić bez zainicjowania wskaźnika, czyli nadania mu wskazania na jakąś zmienną (może być dynamiczna allokacja).

Nie chodziło o nadanie wartości wskaźnikowi. W linii 5 wskaźnik dostaje swoją wartość. Wskazuje "gdzieś w kodzie" na odpowiedni napis. W zasadzie zmienna b powinna być typu const char *, by nie można było próbować modyfikować tego "kodu", ale const wprowadzono do C później, jak już istniały programy, które tego nie miały, bo nie mogły.

komentarz 2 lipca 2022 przez polandonion Mądrala (7,040 p.)

Totalnie błędna byłaby sytuacja, kiedy chcemy nadać zmiennej wskaźnikowej określoną wartość, bez wcześniejszego przypisania wskaźnika do zmiennej.

Do tej pory myslalem, ze wskaznik musi zawierac adres innej zmiennej, na ktora bedzie wskaywal np.

int nrTel=123456789;
int *wsk=&nrTel;

albo w przypadku tablic:

int tab[5];
int *wsk=tab; //opcjonalnie int *wsk=&tab[0];

ale dekleracja wskaznika w taki sposob:

/*const*/ char* b="Ala ma kota";

jest wogole nielogiczna. Powiedziales, ze:

W linii 5 wskaźnik dostaje swoją wartość. Wskazuje "gdzieś w kodzie" na odpowiedni napis.

To oznacza, ze wartoscia wskaznika, czyli adresem innej zmiennej, na ktora wskazuje jest napis? Komputer przechowuje zmienne pod adresami zapisanymi przez liczby calkowite, dodatkowo szestnastkowo, a nie przez napisy.

 

1 odpowiedź

0 głosów
odpowiedź 2 lipca 2022 przez jankustosz1 Nałogowiec (35,880 p.)
edycja 2 lipca 2022 przez jankustosz1
 
Najlepsza

Są to dwie różne sytuacje. Czym jest to wyrażenie - "Ala ma kota" ? Jest to nic innego jak adres w pamięci pod którym jest ten napis, zatem przypisanie tego adresu wskaźnikowi nie jest żadnym problemem.

Jest za to inny problem, ten napis został utworzony już w czasie kompilacji i wrzucony do twojego programu, do części która nie jest modyfikowalna. Z tego powodu próba modyfikacji tego tekstu zakończy się błędem.

Np. spróbuj:

char * w = "Ala ma kota";
w[0] = 'X';
std::cout << w;

A następnie zakomentuj drugą linię. W pierwszym przypadku program się wywali a w drugim nie. Dlatego dla bezpieczeństwa lepiej pisać const *char, aby nie musieć ciągle o tym przypadku pamiętać..

komentarz 2 lipca 2022 przez jankustosz1 Nałogowiec (35,880 p.)

Dodam jeszcze, że jak zrobisz tak to program przejdzie:

char w[] = "Ala ma kota";
w[0] = 'X';
std::cout << w;

W tym przypadku "Ala ma kota" również jest umieszczone w pamięci tylko do odczytu, ale kompilator implicite przekopiuje ten tekst do nowej tablicy.

Podobne pytania

0 głosów
1 odpowiedź 683 wizyt
pytanie zadane 13 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
1 odpowiedź 296 wizyt
pytanie zadane 26 czerwca 2022 w C i C++ przez polandonion Mądrala (7,040 p.)
0 głosów
1 odpowiedź 430 wizyt
pytanie zadane 26 stycznia 2020 w C i C++ przez Oskardes Użytkownik (600 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,961 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!

...