Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

wskaźnik char - dlaczego adres jest stringiem

Ostatnio zmodyfikowano 2016-09-19 23:59
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
wskaźnik char - dlaczego adres jest stringiem
» 2016-09-19 22:18:44
Witam. Jak wiemy wskaźniki zapisujemy tak:
C/C++
#include <iostream>
using namespace std;
int main()
{
    iny y = 5;
    int * x = & y; // wskazanie na zmienna y
    cout << "adres to: " << x << "  a wartosc zmiennej to: " <<* x;
}

Więc, żeby otrzymać wartość zmiennej na którą wskazuje wskaźnik musimy użyć gwiazdki. OK. Ale przy char:

C/C++
#include <iostream>
using namespace std;

int main()
{
    char * x = "abc ar";
    cout << x;
   
}
I tutaj nie musimy używać gwiazdki, bo kiedy jej użyjemy, to pokarze nam pierwszą literę (a). Dlaczego? Czy to dlatego, że wskaźnik char jest wskaźnikiem na tablicę? Coś tego typu?
C/C++
#include <iostream>
using namespace std;

int main()
{
    char tab[] = "abc ar";
    cout << tab;
}

Ale w takim razie dlaczego gwiazdka "pokazuje" nam pierwszy element? Z góry dziękuję za pomoc.
P-151849
karambaHZP
» 2016-09-19 22:30:53
Ale w takim razie dlaczego gwiazdka "pokazuje" nam pierwszy element? Z góry dziękuję za pomoc.
Nie. Gwiazdka jest operatorem dereferencji jak operator
[]
. Użycie go powoduje "wyjęcie" wartości spod danego adresu.
Nazwa tablicy jest adresem na pierwszy element tablicy, więc użycie gwiazdki dla nazwy tablicy wypisze wartość pierwszego elementu.
Następne elementy można wypisywać za pomocą operatora indeksowania lub używając arytmetyki wskaźników.
C/C++
char cstr[] = "abcd";
std::cout << * cstr << '\n'; // a
std::cout << cstr[ 0 ] << '\n'; // równoważny zapis do powyższego
std::cout << *( cstr + 2 ) << '\n'; // c
std::cout << cstr[ 2 ] << '\n'; // równoważny zapis do powyższego
P-151851
pekfos
» 2016-09-19 22:32:41
Wskaźnik wskazuje na element. Za tym elementem może być więcej poprawnych elementów. Żeby odwołać się do elementu, używasz gwiazdki, operatora indeksowania [], itp. Stąd, *"alamakota" to 'a'. Tak to działa dla dowolnego typu. Możesz wypisać cały tekst podając wskaźnik, bo taka jest przyjęta konwencja przechowywania tekstu. Tekst jest ciągiem znaków zakończonym zerem, więc wystarczy podawać adres tego ciągu. Nie możesz tak zrobić z int* bo wskaźnik na int nie ma tak specjalnego znaczenia. Po prostu zostanie wypisany ten przekazany adres.

Nazwa tablicy jest adresem na pierwszy element tablicy
Tablica nie jest wskaźnikiem.
P-151852
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-09-19 22:54:45
a czym różni się to:
C/C++
char cstr[] = "abcd";
od tego:
C/C++
char * cstr = "abcd";
?

Tzn. jedno jest tablicą, a drugie wskaźnikiem na... no właśnie. Na co?
I co właściwie ma oznaczać zapis = "abcd". Przecież to jest wskaźnik, podajemy tu adres.
P-151854
pekfos
» 2016-09-19 23:06:29
C/C++
char t[] = "asd"; // Tablica 4 znaków zainicjalizowana literałem.
const char * p = "asd"; // Wskaźnik na lokalizację, gdzie są 4 znaki (Zapis bez const jest niepoprawny)
Tablicę możesz modyfikować, a danych z drugiego zapisu nie możesz. Do tego można odczytać rozmiar tablicy w bajtach z użyciem sizeof, ale tylko wtedy gdy podana nazwa jest tablicą, a nie wskaźnikiem.

I co właściwie ma oznaczać zapis = "abcd". Przecież to jest wskaźnik, podajemy tu adres.
Literał tekstowy to tablica, nie wskaźnik.
P-151855
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-09-19 23:13:23
super, dzięki, jeszcze 2 pytanka ;)
1. Oprócz tego nie ma innych różnic? Tzn. Lepiej używać tablicy bo... lepiej używać wskaźnika bo...
2. może głupie, ale nurtuje mnie to, dlaczego możemy użyć takiego zapisu
C/C++
char tab[] = "abcd";
cout << tab;
i wypisze nam "abcd"

A tu:
C/C++
int tab2[] { 1, 2, 3 };
cout << tab2;
wypisze nam adres?
P-151856
pekfos
» 2016-09-19 23:17:24
1. Oprócz tego nie ma innych różnic? Tzn. Lepiej używać tablicy bo... lepiej używać wskaźnika bo...
Są i inne różnice, a używa się tego, co w danym przypadku pasuje. Nie ma ogólnego 'wskaźnik jest lepszy od tablicy'.

dlaczego możemy użyć takiego zapisu
C/C++
char tab[] = "abcd";
cout << tab;
i wypisze nam "abcd"
A dlaczego możemy napisać
C/C++
cout << "abcd";
i wypisze "abcd"? Jedno i drugie tablica znaków.
P-151857
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-09-19 23:33:27
tak, ale napisałem też "a tu: (przykład)" i był tam przykład, pokazujący, że po zdefiniowaniu i zainicjalizowaniu tablicy int kiedy napisaliśmy cout<<tab2; pokazało nam adres (czyli inaczej niż przy tablicy char)
P-151861
« 1 » 2
  Strona 1 z 2 Następna strona