[C] ciekawy program ze wskaźnikami

Nighthunter24
Użytkownik
Użytkownik
Posty: 27
Rejestracja: 7 mar 2009, o 10:41
Płeć: Mężczyzna

[C] ciekawy program ze wskaźnikami

Post autor: Nighthunter24 »

Przepraszam że po angielsku jest program. Czy mógłby ktoś mi wyjaśnić krok po kroku co ten program robi? (wskaźniki to moja słaba strona - więc proszę o wyrozumiałość - czytałem o nich ale jakoś niewiele zrozumiałem). Jakby ktoś mi to wytłumaczył po koleji co dane oznaczenia znaczą (np: *c[], **cp[], ***cpp=cp) + działanie programu byłbym bardzo wdzięczny.

Kod: Zaznacz cały

SET No 1 
Write the results of the following program execution: 
#include  <stdio.h> 
char  *c[]  =  { 
"DRUT", 
"LUKA", 
"RANT", 
"BOHR" 
}; 
char  **cp[]  =  {c+3,  c+2,  c+1,  c}; 
char  ***cpp=cp; 

main(void) 
{ 
printf("%s",**++cpp  +  3); 
printf("%s",  *cpp[-1]  +  3); 
printf("%s",  *--*++cpp  +  2); 
printf("%s",  cpp[-1][-1]  +  2); 
printf("
"); 

return  0; 
} 

ANSWER     TRUTKA 
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

[C] ciekawy program ze wskaźnikami

Post autor: Szemek »

w analizie tego przykładu bardzo pomocnym narzędziem może być debugger z Visual C++ 2008

printf("%s",**++cpp + 3); \(\displaystyle{ \hbox{RAN} \boxed{\hbox{T}}}\)
printf("%s", *cpp[-1] + 3); \(\displaystyle{ \hbox{BOH} \boxed{\hbox{R}}}\)
printf("%s", *--*++cpp + 2); \(\displaystyle{ \hbox{DR} \boxed{\hbox{UT}}}\)
printf("%s", cpp[-1][-1] + 2); \(\displaystyle{ \hbox{LU} \boxed{\hbox{KA}}}\)
Nighthunter24
Użytkownik
Użytkownik
Posty: 27
Rejestracja: 7 mar 2009, o 10:41
Płeć: Mężczyzna

[C] ciekawy program ze wskaźnikami

Post autor: Nighthunter24 »

Szemek pisze:w analizie tego przykładu bardzo pomocnym narzędziem może być debugger z Visual C++ 2008

printf("%s",**++cpp + 3); \(\displaystyle{ \hbox{RAN} \boxed{\hbox{T}}}\)
printf("%s", *cpp[-1] + 3); \(\displaystyle{ \hbox{BOH} \boxed{\hbox{R}}}\)
printf("%s", *--*++cpp + 2); \(\displaystyle{ \hbox{DR} \boxed{\hbox{UT}}}\)
printf("%s", cpp[-1][-1] + 2); \(\displaystyle{ \hbox{LU} \boxed{\hbox{KA}}}\)
Tyle to ja wiem - ale czy mógłbyś wytłumaczyć wogóle cały program - tzn. te wszystkie wyrażenia - łącznie z jego działaniem?
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C] ciekawy program ze wskaźnikami

Post autor: soku11 »

Kod: Zaznacz cały

#include <stdio.h>

/* tablica wskaznikow na znaki (tutaj ciagi znakow) */
char* c[]=
{
  "DRUT",
  "LUKA",
  "RANT",
  "BOHR"
};

/* tablica wskaznikow na wskazniki na ciagi znakow; czyli w twoim przypadku wskazuje 
ona odpowiednio na "BOHR",'RANT","LUKA","DRUT" */
char** cp[]={c+3,c+2,c+1,c};
/* tablca wskaznikow na wskazniki na wskazniki na ciagi znakow (:P); czyli poprostu wskaznik na to co
zostalo zrobione w poprzedniej linijce */
char*** cpp=cp;

int main(void)
{
  printf("%s",**++cpp+3);  /* przesuwamy cpp na nastepny wskaznik (czyli na c+2), robimy pierwsza derefernecje, zeby wyluskac nasze c+2, robimy druga referencje zeby wyluskac wskaznik na ciag znakow "RANT" i na koncu przesuwamy ten wskaznik o 3 pozycje, czyli dostajemy ciag znakow "T\0", co skutkuje wypisaniem literki T */
  printf("%s",*cpp[-1]+3);  /*odwolujemy sie poprzez cpp na poczatek tablicy cp (wskazuje teraz na c+3) i przez dereferencje dostajemy sie do skladowej c+3, dereferencja przez gwiazdke udostepnia nam napis "BOHR", przesuwamy sie o 3 pozycje, czyli dostajemy ciag znakow "R\0" */
  printf("%s",*--*++cpp+2); /* znow przesuwamy wskaznik cpp na nastepny wyraz (c+1 tym razem, bo cpp bylo na drugim elemencie) i pobieramy go dereferencja (mamy wiec wskaznik na element "LUKA"), otrzymany wskaznik dekrementujemy przesuwajac sie w tablicy c o jeden do tylu (na ciag znakow "DRUT"), dereferencja zwraca nam wskaznik na ciag znakow "DRUT", przesuwamy wskaznik o dwie pozycje w prawo, czyli dostajemy wskaznik na "UT\0", wyswietli sie wiec UT */
  printf("%s",cpp[-1][-1]+2); /* cpp[-1]: trzymujemy wskaznik 'c+2' (wskaznik na "RANT"); cpp[-1][-1] majac wskaznik na c+2 cofamy sie o jeden w lewo, czyli dostajemy wskaznik na "LUKA", dodajemy dwa, czyli ostateczny wskaznik wskazuje na ciag znakow to "KA\0"; i to daje nam wyraz "TRUTKA"*/
  printf("\n");

  return 0;
}
Pozdrawiam :)
ODPOWIEDZ