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

Inicjalizacja wskaźnika łańcuchem?

0 głosów
513 wizyt
pytanie zadane 18 lutego 2016 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)

Witam, spotkałem się z zapisem:

const char * wsk = "blabla";

Czy wobec tego wskaźnikowi zamiat adresu dajemy... łańcuch znaków?

Na czym polega ten zapis i jak działa?

Są inne, podobne zapisy,  w których zamiast adresu dajemy cos innego?

2 odpowiedzi

+2 głosów
odpowiedź 18 lutego 2016 przez draghan VIP (106,230 p.)
wybrane 18 lutego 2016 przez Sinnley
 
Najlepsza

EDIT: adrian17 w zasadzie wszystko wyjaśnił, mi pozostaje dopisać tylko "mniej formalna odpowiedź". ;)

Łańcuch znaków w C/C++ to tablica zmiennych typu char, a tablice w tych językach to ciągłe obszary pamięci, do których dostęp realizuje się za pomocą wskaźników.

Częściej można spotkać zapis char napis[] = "blabla", jednak wersja ze wskaźnikiem, ( (!) o ile tylko jest to stały wskaźnik, const char *), jest równoważna*.

Jakieś pytania? :)


*- nie jest równoważna, patrz komentarz niżej

komentarz 18 lutego 2016 przez Sinnley Stary wyjadacz (12,810 p.)
dlaczego wskaźnik musi być stały?
komentarz 18 lutego 2016 przez draghan VIP (106,230 p.)

Może trochę nieprecyzyjnie się wyraziłem - sam wskaźnik nie musi być stały, tylko musi wskazywać na stałą wartość.

Jest tak dlatego, że napisy wpisane explicite w kod źródłowy są umieszczane w obszarze pamięci tylko do odczytu i próba zmiany zawartości danej komórki skończy się naruszeniem praw ochrony dostępu.

Polecam eksperyment:

int main()
{
    char *napis = "aba";
    napis[0] = 'c';
    return 0;
}

EDIT: zauważyłem, że to co napisałem jest nieprawdą. Zapis const char* i char[] nie są tożsame - w drugim przypadku napis zostaje przecież umieszczony w pamięci, której zawartość możemy modyfikować. Przepraszam za wprowadzenie w błąd w tej kwestii.

komentarz 18 lutego 2016 przez adrian17 Mentor (355,180 p.)

char *napis = "aba";

Ten zapis nie jest poprawny w C++ie, trzeba tam dodać const.

komentarz 20 lutego 2016 przez draghan VIP (106,230 p.)
Właśnie dlatego nazwałem to eksperymentem. :)
+2 głosów
odpowiedź 18 lutego 2016 przez adrian17 Mentor (355,180 p.)

Bardzo formalna odpowiedź:

  • "blabla" ma typ const char [7].
  • Typ tablicowy może być cicho konwertowalny do typu wskaźnikowego (na wskaźnik na pierwszy element)
  • Tak więc do wskaźnika przypisywany jest adres pierwszego elementu tablicy.

Podobne pytania

0 głosów
1 odpowiedź 277 wizyt
0 głosów
1 odpowiedź 497 wizyt
pytanie zadane 22 grudnia 2017 w C i C++ przez MikeMG Początkujący (330 p.)
+1 głos
1 odpowiedź 370 wizyt
pytanie zadane 12 września 2016 w C i C++ przez Ciartek Nowicjusz (210 p.)

93,742 zapytań

142,680 odpowiedzi

323,299 komentarzy

63,328 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...