• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed wyjaśnienie kilku linijek (funkcja, wskażniki)

Object Storage Arubacloud
0 głosów
175 wizyt
pytanie zadane 3 listopada 2015 w C i C++ przez baszmest Gaduła (3,080 p.)
zamknięte 3 listopada 2015 przez baszmest


#include <stdio.h> 
#include <stdlib.h>
#include <string.h> 

int
alphacmp( const void *a, const void *b ) {
  char **ca = (char**)a;
  char **cb = (char**)b;
  return strcmp( ca, cb );
}

int
main( int argc, char **argv ) {
  int i;

  qsort( argv+1, argc-1, sizeof *argv, alphacmp );

  for( i= 1; i < argc; i++ )
    printf( "%s\n", argv[i] );

  return 0;
}

Wiem na jakiej zasadzie działa funkcja, jednak nie do końca rozumiem kilka szczegółów. Mógłby ktoś wytłumaczyć czym są 

const void *a, const void *b // rozumiem że wskaźniki, ale dlaczego void i const

oraz co dokładnie oznacza zapis

char **ca = (char**)a; //wlaściwie, to nie rozumiem tego (char**)

Z góry dzięki :)

komentarz zamknięcia: Wszystko zostało pięknie wytłumaczone, nie mam więcej pytań :)

1 odpowiedź

+1 głos
odpowiedź 3 listopada 2015 przez Radfler VIP (101,030 p.)
wybrane 3 listopada 2015 przez baszmest
 
Najlepsza

Śpieszę z wyjaśnieniami:

1. Wskaźnik na void* to wskaźnik, który na nic nie wskazuje (żaden konkretny obiekt). Po prostu przechowuje adres. Słowo const zostało użyte, aby kompilator uznał to co to jest pod tym adresem za wartość stałą (const -> constant). Tu masz to dokładniej opisane (zjedź do sekcji "Pointers to void"): http://en.cppreference.com/w/c/language/pointer.

2. Jest to proste rzutowanie. Typ char** to typ wskaźnika na wskaźnik, który wskazuje na obiekt typu char (coś takiego).


Pozdrawiam! :)

komentarz 3 listopada 2015 przez baszmest Gaduła (3,080 p.)

Ok, podejrzewałem coś takiego, a chciałem się upewnić. Dzięki. Jeszcze tylko, powiedz czy dobrze rozumiem:
-wskaźnik typu void służy tylko do tymczasowego przechowania adresu - nie można zrobić dereferncji (bo nie wskazuje na zaden konkretny obiekt0 

-(char**)a oznacza, ze adres w wskaźniku a ma zostać zinterpretowany jako wskaźnik na wskaźnik na znak.

A czy zadziałałaby taka opcja: 

int
alphacmp( const void *a, const void *b ) {

  return strcmp( (char**)a, (char**)b );

}

?.

komentarz 3 listopada 2015 przez Radfler VIP (101,030 p.)

1. Zgadza się.

2. Też się zgadza.

3. Tak ten zapis zadziała (ale masz mały błąd opisany niżej).

Znalazłem też błąd w Twoim programie. Wg. mnie powinieneś rzutować na typ char*, a nie char**, gdyż funkcja strcmp przyjmuje właśnie taki parametr: http://en.cppreference.com/w/c/string/byte/strcmp.

komentarz 3 listopada 2015 przez baszmest Gaduła (3,080 p.)
Dzięki raz jeszcze. Program nie jest mój :) A co do błedu, to mimo tego program działa poprawnie. :)
Zamykam temat. Dobrze wyjaśnione :)

Podobne pytania

0 głosów
1 odpowiedź 664 wizyt
pytanie zadane 26 października 2015 w C i C++ przez Iras Obywatel (1,800 p.)
0 głosów
1 odpowiedź 138 wizyt
pytanie zadane 9 czerwca 2016 w C i C++ przez Filius Gaduła (4,120 p.)
0 głosów
0 odpowiedzi 554 wizyt
pytanie zadane 20 maja 2020 w C i C++ przez fortuna Początkujący (310 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...