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: #include <iostream> using namespace std; int main() { iny y = 5; int * x = & 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: #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? #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. |
|
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. char cstr[] = "abcd"; std::cout << * cstr << '\n'; std::cout << cstr[ 0 ] << '\n'; std::cout << *( cstr + 2 ) << '\n'; std::cout << cstr[ 2 ] << '\n';
|
|
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. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-09-19 22:54:45 a czym różni się to: od tego: ? 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. |
|
pekfos |
» 2016-09-19 23:06:29 char t[] = "asd"; const char * p = "asd";
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. |
|
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 char tab[] = "abcd"; cout << tab;
i wypisze nam "abcd" A tu: int tab2[] { 1, 2, 3 }; cout << tab2;
wypisze nam adres? |
|
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
char tab[] = "abcd"; cout << tab; i wypisze nam "abcd" |
A dlaczego możemy napisać i wypisze "abcd"? Jedno i drugie tablica znaków. |
|
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) |
|
« 1 » 2 |