Programování OPERÁTOR SIZEOF, FUNKCE, POLE JAKO PARAMETRY FUNKCÍ ERIK KRÁL
Obsah Operátor sizeof Funkce Volání funkce Předávání argumentů hodnotou Pole jako parametr funkce Pole jako návratový typ
Operátor sizeof Operátor sizeof zjistí délku typu nebo objektu v bajtech. Používáme ho především u dynamické alokace paměti, kterou probereme později. V této lekci ho využijeme v souvislosti s předáváním pole jako argumentu funkce. int pocet = 0; pocet = sizeof(char); pocet = sizeof(int); pocet = sizeof(float); pocet = sizeof(double); pocet = sizeof(int[4]); char x = 0; int pole[4] = { 0 }; pocet = sizeof(x); pocet = sizeof(pole); Délka typu Délka objektu Otestuje, jaká bude délka pole int a jednoho int
Funkce Funkce v C přiřazují složený příkaz k identifikátoru. Funkce mohou přijímat 0 a více parametrů, které se zapisují jako seznam parametrů funkce oddělený, kde každý parametr má typ a identifikátor, případně specifikátor například const. Funkce mohou vracet hodnotu pomocí příkazu return. Typ void znamená, že funkce nevrací žádnou hodnotu. int VratSoucet(int x, int y) { int soucet = x + y; return soucet; } Identifikátor (název funkce) Seznam parametrů Návrat hodnoty
Deklarace a definice funkce Deklarace hlavičky funkce a definice těla funkce mohou být uvedeny zvlášť. Deklarace potom bývají typicky v souborech s příponou.h a definice v souborech s příponou.c. int VratSoucet(int, int); int VratSoucet(int x, int y) { int soucet = x + y; return soucet; } Deklarace funkce (hlavička funkce), není nutné uvádět názvy parametrů Definice funkce
Volání funkce Funkce se volá pomocí jejího identifikátoru (názvu) a mohou se předávat argumenty. Výsledkem volání funkce je návratová hodnota, kterou můžeme přiřadit pomocí operátoru přiřazení. int VratSoucet(int x, int y) { int soucet = x + y; return soucet; } int main() { int a = 3; int b = 2; int z = VratSoucet(a, b); printf("soucet = %d\n", z); } Volání funkce Návratová hodnota
Předávání argumentů hodnotou Při volání funkce se předává hodnota argumentů. Pro parametry funkce se tedy vytvoří nové lokální proměnné, které přestanou existovat po skončení funkce. int VratSoucet(int x, int y) { int soucet = x + y; ++x; y = 10; return soucet; } int main() { int x = 3; int y = 2; int z = VratSoucet(x, y); printf("soucet = %d\n", z); } Proměnné x a y jsou nezávislé na parametrech x a y. Otestuje že jejich změna nemá vliv na hodnotu proměnných ve funkci main().
Pole jako parametr funkce Pole se předává funkci jako ukazatel a ztrácí informaci o počtu prvků. int VratPocetBajtu(int pole[3]) { int pocetBajtu = sizeof(pole); return pocetBajtu; } void main() { int pole[3] = { 0 }; int pocetBajtu = 0; pocetBajtu = sizeof(pole); pocetBajtu = VratPocetBajtu(pole); } Protože se pole předává jako ukazatel, tak operátor sizeof vrací jen délku typu int* Otestujte, že se počet bajtů bude lišit.
Pole jako parametr funkce Protože se předává ukazatel a ne nezávislá (hluboká) kopie pole, tak je možné ve funkci změnit prvky pole, které je parametrem funkce. #include #define POCET 3 void Napln(int pole[], int pocetPrvku, int hodnota) { for (int i = 0; i < pocetPrvku; i++) { pole[i] = hodnota; } void main() { int pole[POCET] = { 0 }; Napln(pole, POCET, 1); for (int i = 0; i < POCET; i++) { printf("%i ", pole[i]); } I ve funkci Napln měníme hodnotu prvků proměnné pole ve funkci main() protože zapisujeme na stejné místo v paměti.
Pole jako návratový typ Pole nemůže být použito jako návratový typ funkce. Místo toho můžeme využít struktury, dynamické alokace paměti a nebo mít pole jako argument funkce a do něj pak zapisovat. char[] VratPrvniZnaky(char pole[], int pocetPrvnich) { } void ZkopirujZnaky(char odkud[], char kam[], int pocetZnaku) { for (int i = 0; i < pocetZnaku; i++) { kam[i] = odkud[i]; } void main() { char text[] = "ahoj jak se mas"; char buffer[4]; ZkopirujZnaky(text, buffer, 4); } Zkopíruje první 4 znaky do pole buffer
Pole jako parametr funkce Live coding
Děkuji za pozornost Otázky?