czarek1959 Temat założony przez niniejszego użytkownika |
Tablice znaków i wskaźniki w C/C++ » 2011-04-10 20:58:27 Witam,
Jestem już znacznie dalej na etapie nauki C/C++, jednak wciąż wracam do temetu (w zasadzie "abcadła" C/C++), który mnie nurtuje i nie bardzo do mnie to dociera, ale jednak je zadam. Poniżej taki prosty przykładzik (fragment kodu):
int x = 1; int * wsk; wsk = & x; * wsk = 2
ono miało wartość 2
czyli ok.
Teraz postępuję analogicznie z tablicą np.
char * tab[ 3 ] tab[ 0 ] = "ala"; tab[ 1 ] = "ma"; tab[ 2 ] = "kota";
powyższe działa, z tym, że zasadnicze pytanie brzmi:
dlaczego w tym przypadku pisząc tab[0] = "ala" nie muszę pisać *tab[0] = "ala" (błąd kompilatora), jak w przypadku zmiennych typu integer. Przecież zasada i logika powinna być taka sama? W przypadku tablic, wynika że operuję od razu na adresach.
Przyjąłem to, że tak musi być i koniec, jednak nie do końca to rozumiem. Być może, że w tym kursie (który jest super !) przeoczyłem gdzieś wyjąsnienie.
Mam nadzieję, że brzmi to jasno.
Życzliwych proszę o wyjaśnienie.
Pozdrawiam |
|
ison |
» 2011-04-10 21:00:43 int tab[ 5 ]; tab[ 3 ] = 777;
wiesz jak działa operator [] w powyższym przypadku? jest równoznaczne z gdy deklarujesz tablicę to nazwa tablicy jest wskaźnikiem na 1 element operator [] jest już sam w sobie wyłuskiwaniem dlatego w powyższym kodzie nie musisz pisać |
|
czarek1959 Temat założony przez niniejszego użytkownika |
Tablice znaków i wskaźniki w C/C++ » 2011-04-10 21:43:46 To jest jasne. Tylko dlaczego w takim radzie dla tablicy znaków poniższe jest błędne (przynajmniej mnie kompilator wyrzuca błąd):
char tab[3];
tab[0] = "ala";
itd...
i muszę użyć chat *tab[3],
a dla typu integer jest ok. I to jest główne pytanie. Albo deklaracja tablicy wskazuje na pierwszy element
dla wszystkich typów, albo nie?
Dla
int tab[3];
tab[0] = 10;
....
jest poprawne. |
|
ison |
» 2011-04-10 22:04:48 ponieważ char to jeden znak, a nie ciąg znaków... std::string tab[ 3 ]; tab[ 0 ] = "ala";
|
|
czarek1959 Temat założony przez niniejszego użytkownika |
Tablice znaków i wskaźniki w C/C++ » 2011-04-10 22:14:13 I tu właśnie pokazujesz jak obejść problem, co już dawno mam za sobą. A co jeśli użycie klasy string jest
niemożliwe np. w przypadku Allegro, które jest napisane w C i jego funkcje nie operują na stringach.
Na pewno też problemem też nie jest to, że to ciąg, a nie jeden znak bo jeśli damy
char tab[3];
tab[0] = 'a' // czyli 1 znak
itd...
to, to też nie działa i kompilator pokazuje błąd.
Czyli problem nie wyjaśniony, tymniemniej jednak dziękuję za próby. |
|
ison |
» 2011-04-10 22:43:40 I tu właśnie pokazujesz jak obejść problem, co już dawno mam za sobą. |
ale jaki problem? wszystko się zgadza, nie ma żadnych wyjątków dla charów... A co jeśli użycie klasy string jest niemożliwe |
zawsze jest możliwe... std::string ma metodę .c_str() która zwraca C stringa np. w przypadku Allegro, które jest napisane w C i jego funkcje nie operują na stringach.
|
kto Ci takich bzdur naopowiadał? w jakim C? to że jako parametr jakiejś funkcji przyjmuje C stringa to nie znaczy że allegro jest napisane w C i jego funkcje nie operują na stringach.
|
chyba miałeś na myśli std::string, string to nazwa dla ciągu znaków to też string zresztą jak już napisałem wyżej std::string też można użyć w przypadku allegro Na pewno też problemem też nie jest to, że to ciąg, a nie jeden znak bo jeśli damy
char tab[3]; tab[0] = 'a' // czyli 1 znak itd...
to, to też nie działa i kompilator pokazuje błąd.
|
ke? gdzie niby pokazuje błąd? poza tym że nie masz średnika po podstawieniu to innego błędu tu nie widzę ;) Czyli problem nie wyjaśniony
|
wyjaśniony, tylko niestety za mało starasz się go zrozumieć... może kiedyś sam na to wpadniesz tymniemniej jednak dziękuję za próby.
|
proszę powracając do Twojego poprzedniego posta... char tab[3]; tab[0] = "ala"; itd... i muszę użyć chat *tab[3],
|
wiesz dlaczego? ponieważ to 1 znak, a może być wskaźnikiem na tablicę charów czyli na ciąg znaków :) |
|
malan |
» 2011-04-10 23:23:00 To ja też wtrącę swoje trzy grosze ;p dlaczego w tym przypadku pisząc tab[0] = "ala" nie muszę pisać *tab[0] = "ala" (błąd kompilatora), jak w przypadku zmiennych typu integer. |
Wiele jest dyskusji na temat tego, czy tablica jest wskaźnikiem. Ja przyjmuję, że nie jest dlatego powiem Ci, że porównujesz dwie różne rzeczy. Wskaźnik: int sixNine = 69; int * ptr = & sixNine; * ptr = 666; Tablica (typu int): int array[ 69 ]; array[ 0 ] = 1;
array[ 68 ] = 69; Ty się pytasz dlaczego do wskaźnika trzeba się odwoływać za pomocą * , a w przypadku tablicy nie... Logicznie rzecz biorąc, to co, w przypadku tablicy typu int miałby oznaczać ten zapis: * array[ 0 ] ? Wtedy array[ 0 ] zawierałby adres do elementu zerowego? ;) Oczywiście można zrobić też tak: int array[ 69 ]; * array = 1;
*( array + 68 ) = 69; Zapis, o którym mówisz ( * array[ 0 ] ) jest możliwy, tzn. da się napisać kod, w którym taki zapis będzie legalny: #include <iostream>
int main() { int * array[ 1 ]; int variable = 69; array[ 0 ] = & variable; std::cout << "Adres zmiennej: " << array[ 0 ] << std::endl; std::cout << "Wartosc zmiennej: " << * array[ 0 ] << std::endl; } Jeżeli nie zrozumiałeś przykładu to się nie przejmuj ;) W tym momencie wena twórcza się skończyła... |
|
czarek1959 Temat założony przez niniejszego użytkownika |
Tablice znaków i wskaźniki w C/C++ » 2011-04-11 20:26:09 Widzę, że podchodzisz do tematu bardzo nerwowo (dotyczy ISON'a - mam nadzieję, że się nie obrazisz).
Nie mogę się z Tobą zgodzić w kilku sprawach (np. że Allegro nie jest napisane w C - świadczy o tym chociażyby
#include <allegro.h>, z mądrych ksiażęk np. Pana Grębosza "Programowanie w języku C++" wyraźnie wynika, że Allegro to język C, a nie C++, ponadto w powiedziałem, że Allegro nie stosuje klasy string, a to to samo co
std:string itd...
Jednak rzeczowy post od MALAN'a rozjaśnił mi w głowie (dzięki ! - jednak dla początkujących C/C++ budzi pewne wątpliwości, które znikną w miarę upływu czasu - mam nadzieję) więc zamykam temat bo nie ma sensu go dalej ciągnać.
Dziękuję za posty obu Użytkownikom i pozdrawiam ! |
|
« 1 » |