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

Tablice znaków i wskaźniki w C/C++

Ostatnio zmodyfikowano 2011-04-11 20:26
Autor Wiadomość
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):

C/C++
int x = 1;
int * wsk;
wsk = & x;
* wsk = 2 // tym sposobem zmieniłem sobie wartość x na 2 i jeśli wyświetlę x to będzie
ono miało wartość 2
czyli ok.

Teraz postępuję analogicznie z tablicą np.

C/C++
char * tab[ 3 ] // muszę tak, aby poniższe zadziałało
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
P-30580
ison
» 2011-04-10 21:00:43
C/C++
int tab[ 5 ];
tab[ 3 ] = 777;
wiesz jak działa operator [] w powyższym przypadku?
C/C++
tab[ 3 ] = 777;
jest równoznaczne z
C/C++
*( tab + 3 ) = 777;

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ć
C/C++
* tab[ 3 ] = 777;
P-30581
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.
P-30583
ison
» 2011-04-10 22:04:48
ponieważ char to jeden znak, a nie ciąg znaków...
C/C++
std::string tab[ 3 ];
tab[ 0 ] = "ala";
P-30586
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.
P-30587
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
C/C++
char a[ 50 ];
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ż
C/C++
char a;
to 1 znak, a
C/C++
char * a;
może być wskaźnikiem na tablicę charów czyli na ciąg znaków :)
P-30589
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:
C/C++
int sixNine = 69;
int * ptr = & sixNine;
* ptr = 666;

Tablica (typu int):
C/C++
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:
C/C++
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:
C/C++
#include <iostream>

int main()
{
    int * array[ 1 ]; // Tworzymy tablicę wskaźników...
    int variable = 69;
   
    array[ 0 ] = & variable; // Przypisujemy zerowemu elementowi adres zmiennej @variable.
   
    std::cout << "Adres zmiennej: " << array[ 0 ] << std::endl; // Jak pamiętamy- @array[0] zawiera ADRES zmiennej...
    /* @array to tablica wskaźników. Wskaźnikowi przypisaliśmy adres (tak jak w moim pierwszym przykładzie).
               Jak wiemy, aby odczytać to na co pokazuje wskaźnik musimy poprzedzić jego nazwę *.
            */
    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...
P-30591
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 !
P-30624
« 1 »
  Strona 1 z 1