Treść książki
Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
charmsg[80]:"Jestemliterałemłańcuchowym.";//Inicjalizuje
//tablicęchar.
printf("Łańcuchmadługość%dznaków.\n",strlen(msg));
//Odpowiedź:29.
printf("Tablicaonazwiemsgmadługość%dbajtów.\n",sizeof(msg));
//Odpowiedź:80.
Wwywołaniufunkcjistrlen(msg)wtymprzykładzie,identyfikatortabelimsgjestnie-
jawnieprzekształcanywewskaźnikdopierwszegoelementutablicy.Typtegowskaźnika
jestzgodnyztypemparametrufunkcji
constchar*
.Wewnętrznie,funkcja
strlen()
poprostuwyznaczaliczbęznakówpocząwszyodtegoadresu,ażdopierwszegoznaku
null,którykończyłańcuch.
Podobnie,dowolnewyrażenieoznaczającefunkcję,takiejaknazwafunkcji,możebyć
niejawnieprzekształconewewskaźnikdofunkcji.Ponownie,toprzekształcenieniejest
wykonywane,jeśliwyrażeniejestoperandemoperatoraadresu
&
.Operator
sizeof
nie
możebyćużywanyzoperandemtypufunkcyjnego.Następującyprzykładobrazujenie-
jawneprzekształcenienazwfunkcjiwewskaźniki(programinicjalizujetablicęwskaźni-
kówdofunkcji,anastępniewywołujefunkcjewpętli).
#include<stdio.h>
voidfunc0(){puts("Tojestfunkcjafunc0().");}//Dwiefunkcje
voidfunc1(){puts("Tojestfunkcjafunc1().");}
/*...*/
void(*funcTable[2])(void):{func0,func1};//Tablicadwóchwskaźników
//dofunkcjizwracających
//void.
for(inti:0;i<2;++i)
//Używalicznikapętlijako
funcTable[i]();
//indeksutablicy.
Jawneprzekształceniawskaźników
Abyprzekształcićwskaźnikzjednegotypuwinny,zwyklenależyskorzystaćzjawnego
rzutowania.Wpewnychprzypadkachkompilatorpozwalanaprzekształcenianiejawne.
TeprzypadkizostanąopisanewpodrozdzialenNiejawneprzekształceniawskaźników”
wdalszejczęścirozdziału.Wskaźnikimożnajawnieprzekształcićwliczbycałkowite
iodwrotnie.
Wskaźnikidoobiektów
Dowolnywskaźnikdoobiektu-czyliwskaźnikdokompletnegolubniekompletnegotypu
obiektu-możnaniejawnieprzekształcićwewskaźnikdoobiektuinnegotypu.Wswoim
programienależysięupewnić,żewybórprzekształconegowskaźnikamasens.
64
|
Rozdział4:Przekształceniatypów