Witam ponownie,
1. Co do funkcji strcat(.....), to sam sobie w sumie odpowiedziałeś. Prototyp funkcji wygląda następująco:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Zamieniałeś stringi: źródłowy z docelowym .Tak nawiasem mówiąc w WIN_AVR masz manuala z opisem funkcji bibliotecznych (..../WinAVR-20100110/doc/avr-libc/avr-libc-user-manual/index.html).
iwi napisał(a):
*** dopisano później
trochę sam sobie odpowiadam na jedno z pytań dotyczące funkcji strcat
znalazłem w końcu przykład i chyba już wiem o co chodzi - po prostu źle ją wywoływałem - co prawda on jest na tablicy a nie na wskaźniku, ale może jakoś to przejdę.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jak już Ci pisałem, tablice można reprezentować i przetwarzać za pośrednictwem arytmetyki wskaźników. Jednak, jeśli chcesz wykonać operacje jak w przykładzie powyżej, to
musisz w jakiś sposób zarezerwować obszar pamięci na Twojego stringa wynikowego i to właśnie robi definicja:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
No bo jeśli zrobisz coś takiego:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to jest to jedynie deklaracja wskaźnika do obiektu typu char, ale kompilator nie przydzieli obszaru pamięci na ten obiekt ( obiekty ). Oczywiście można to zrobić inaczej, nie definiując tablicy, na przykład za pośrednictwem np. funkcji malloc(....), ale to trochę wyższa szkoła jazdy i nie będę Ci mieszał.
iwi napisał(a):
.....Druga sprawa to ciągle wskaźniki - jest sobie coś takiego
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
tutaj chciałbym coś dopytać
składnia jest taka
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
reszta zadeklarowana jest jako char * reszta;
w funkcji wywołujemy to jako &reszta. No i tutaj wszystko się
przykład z postu marmura
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
ale tutaj mamy inny przykład bo nasza zmienna nie jest zwykłym char tylko wskaźnikiem.
co wtedy robi znak "&" - skoro "reszta" jest wskaźnikiem to dlaczego nie jest wywołanie przez "reszta"
zapewne chodzi o te 2 gwiazdki w funkcji **ptrptr. No i tutaj jest zaplątanie.
Gdyby w funkcji było zapytanie oz końcówką char *ptrptr to znaczy że mamy do czynienia ze wskaźnikiem. Skoro są ** to pewnie chodzi o wskaźnik do wskaźnika - ale co to takiego w ogóle jest.
Załóżmy że
char znak = "procesor";
char *wsk = &znak - tzn że pod zmienną wsk przechowujemy adres pamięci jakiś 2 bajtowy.
char **wskwsk = no właśnie co to w ogóle nam da - adres do adresu?
przepraszam że takie pytania, ale o ile wskaźniki do jednej kropeczki można zrozumieć, to to już jest pogmatwane.
1.
Nie możesz tego tak robić !!!!:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
bo zapis char znak = "abcdefgh" nie ma sensu !!!!. Przecież char to jest typ zmiennej prostej - czyli jednego elementu, a Ty usiłujesz przypisać do niego łańcuch tekstowy. jeśli już to tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
czyli inaczej mówiąc, musisz zadeklarować
tablicę na "procesor", a kompilator sam policzy jej rozmiar, uwzględniając znak \0 i sam ten znak umieści na końcu. Można też tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i to dokładnie zadziała tak samo, jak to powyżej. Cały problem polega chyba na tym, że Kolega
marmur pisał o odnosząc się do zmiennych prostych, a Ty nie potrafisz tego przenieść na zmienne tablicowe. W przypadku tablic, czy wskaźników do elementów stringa będzie w sumie analogicznie ale z pewnymi niuansami:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
A teraz wskaźnik do wskaźnika, czyli to: **ptr. Brzmi trochę przerażająco, ale w sumie nie jest wcale takie trudne. Załóżmy, że mamy 3 zmienne proste : x,y,z. Wtedy:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Można oczywiście pójść dalej: wskaźnik do wskaźnika do wskaźnika ( char*** ) itd. i wcalę nie żartuję, nieraz się to przydaje

. Pewnie teraz zastanawiasz się, dlaczego takie kombinacje ? Przyjrzyjmy się na chwilę prototypowi funkcji strtok_r(.......):
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Funkcja ta wymaga dwóch parametrów wejściowych: wskaźnika na string do obróbki, wskaźnika na separator ( który też może być stringiem ) i ma zwrócić jeden parametr wyjściowy. To też ma być w sumie wskaźnik na tego Twojego stringa "reszta", ale przecież funkcja nie wiedziała by, gdzie ma tego stringa umieścić !!! Konstrukcja: char** last w tym wypadku rozwiazuje problem, na bo musimy podać adres do miejsca w pamięci, od którego to miejsca ta funkcja ma umieścić tego stringa, dlatego jako parametr musimy podać: &reszta ( i to będzie właśnie ten wskaźnik do wskaźnika! - popatrz an to, co napisałem powyżej ), przy założeniu, że reszta jest typu char*. Oczywiście zastosowań tego mechanizmu jest więcej, np. tablice wskaźników do wskaźników ( masz np. elementy menu o różnej długości i chcesz w prosty sposób je wyświetlać ), itd.
Przetraw
dokładnie to co napisałem, bo jeśli to załapiesz, to będziesz dokładnie wiedział, jak korzystać ze wskaźników. Najważniejsze moim zdaniem, abyś zrozumiał dokładnie ścisły związek ( wręcz nawet analogię ) między wskaźnikami i tablicami.
Pozdrawiam, QuadMan.