Professional Documents
Culture Documents
vod do C, 8.10.2013
PB071
Organizan
vod do C, 8.10.2013
PB071
Organizan
Studentt poradci vyuvejte
mstnost B011 asy na hlavnm webu
vod do C, 8.10.2013
PB071
Prce s poli
vod do C, 8.10.2013
PB071
Jednotliv prvky pole jsou v pamti za sebou Promnn typu pole obsahuje adresu prvnho prvku pole
int *pArray = array; int *pArray = &array[0];
Indexuje se od 0
n-t prvek je na pozici [n-1]
PB071
vod do C, 8.10.2013
Ukazatelov aritmetika
Aritmetick opertory provdn nad ukazateli Vyuv se faktu, e array[X] je definovno jako *(array + X) Opertor + pit k adrese na rovni prvk pole
nikoli na rovni bajt! obdobn pro -, *, /, ++ ...
vod do C, 8.10.2013
PB071
myArray[0] (hodnota)
myArray+2 (adresa)
myArray (adresa)
10
11
12
13
14
pArray (adresa)
18
19
vod do C, 8.10.2013
PB071
Co vrt myArray[10]? Co vrt myArray[3]? Co vrt myArray + 3? Co vrt *(pArray 2) ? Co vrt pArray - myArray ?
vod do C, 8.10.2013
PB071
ten/zpis mimo alokovanou pam me zpsobit pd nebo nedouc zmnu jinch dat (kter se zde nachz)
int array[10]; array[100] = 1; // runtime exception
vod do C, 8.10.2013
PB071
Tutoril v etin
Programovn v jazyku C
http://www.sallyx.org/sally/c/
vod do C, 8.10.2013
PB071
Multipole
vod do C, 8.10.2013
PB071
Jednotliv prvky pole jsou v pamti za sebou Promnn typu pole obsahuje adresu prvnho prvku pole
int *pArray = array; int *pArray = &array[0];
Indexuje se od 0
n-t prvek je na pozici [n-1]
PB071
Vcerozmrn pole
Pravohl pole N x M
int array[2][4];
[0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3]
stejn poet prvk v kadm dku int array[N][M]; (pole ukazatel o dlce N, v kadm adresa pole int o dlce M)
PB071
PB071
Pro zamylen
Lze takto realizovat trojrozmrn pole?
int array3D[NUM_X][NUM_Y][NUM_Z];
array3D[x][y][z] ?
int array1D[NUM_X*NUM_Y*NUM_Z]; array1D[x*(NUM_Y*NUM_Z) + y*NUM_Z + z]];
Pro?
vod do C, 8.10.2013
PB071
int* pArray;
int array1D[4];
[0] [1] [2] [3]
Nepravohl pole
0x...
Ukazatel na pole
adresa prvnho prvku
int array[4]; int* pArray = array;
0x...
0x...
0x...
0x...
Pole ukazatel
pole poloek typu ukazatel
int* pArray1D[4]; int* pArray1D[4];
0x... 0x... 0x... 0x...
PB071
Hlavikov soubory
vod do C, 8.10.2013
PB071
Modulrn programovn
Program typicky obsahuje kd, kter lze pout i v jinch programech
nap. vpoet faktorilu, vpis na obrazovku... sname se vyhnout cut&paste duplikaci kdu
vod do C, 8.10.2013
PB071
#ifndef _STDIO_H_ #define _STDIO_H_ int fprintf (FILE *__stream, const char *__format, ...)
// ...other functions
vod do C, 8.10.2013
#endif /* MYLIB_H_ */
PB071
vod do C, 8.10.2013
PB071
main.c #include " library.h" int main() { foo(5); } gcc E main.c main.i int foo(int a); int main() { foo(5); }
vod do C, 8.10.2013
PB071
Textov etzce
vod do C, 8.10.2013
PB071
vod do C, 8.10.2013
PB071
etzce v C
etzce v C jsou pole znak ukonench binrn nulou "Hello world" H e l l o w o r l Dky ukonovac nule nemusme udrovat dlku pole
pole znak prochzme do vskytu koncov nuly etzec lze zkrtit posunutm nuly vznik riziko jejho pepsn (viz. dle)
\0
Deklarace etzc
char myString[100]; // max. 99 znak + koncov nula char myString2[] = Hello; // dlka pole dle konstanty, viz dle
PB071
etzcov konstanta v C
Je uzaven v vozovkch "" ("retezcova_konstanta") Je uloena v statick sekci programu Obsahuje koncovou nulu (binrn 0, zpis 0 nebo \0)
pozor, 0 NEN binrn nula (je to ascii znak s hodnotou 48)
Pklady
(pouze koncov 0) Hello (5 znak a koncov nula) Hello world Hello \t world
vod do C, 8.10.2013
PB071
Inicializace etzc
Pozor na rozdl inicializace etzec a pole
char answers[]={'a','y','n'}; nevlo koncovou nulu char answers2[]="ayn"; vlo koncovou nulu
Vimnte si rozdlu
vod do C, 8.10.2013
PB071
Inicializace etzc
Promnnou meme pi vytven inicializovat
doporuen postup, v opanm ppad je potenm obsahem pedchoz smet z pamti inicializace vrazem, nap. konstantou (int a = 5;)
vod do C, 8.10.2013
PB071
2. Jako s polem
vyuit opertoru []
vod do C, 8.10.2013
PB071
myString2 (adresa)
PB071
Obecn pravidla
funkce pedpokldaj korektn C etzec ukonen nulou funkce modifikujc etzce (strcpy, strcat...) oekvaj dostaten pamov prostor v clovm etzci jinak zpis za koncem alokovanho msta a pokozen pi modifikaci vtinou dochz ke korektnmu umstn koncov nuly pozor na vjimky
vod do C, 8.10.2013
PB071
Jak st dokumentaci?
jmno funkce
detaily k parametrm, jejich oekvan tvar ukzka pouit, velmi pnosn pbuzn a souvisejc funkce, pnosn, pokud zobrazen funkce nespluje poadavky
Pevzato z http://www.cplusplus.com/reference/clibrary/cstring/strcpy/
vod do C, 8.10.2013
PB071
PB071
Pro manipulaci se irokmi znaky jsou dostupn analogick funkce v hlavikovm souboru wchar.h
nzev funkce obsahuje wcs namsto str nap. wchar_t *wcscpy(wchar_t*, const wchar_t *);
vod do C, 8.10.2013
PB071
ast problmy
nap. strcpy
nsledn funkce nad etzcem nefunguj korektn vznikne nap. nevhodnm pepisem (N+1 problm)
chybn, porovnv hodnotu ukazatel, nikoli obsah etzc nutno pout if (strcmp(myString, Hello) == 0) { }
PB071
Pole etzc
Pole ukazatel na etzce Typicky nepravohl (etzce jsou rzn dlouh) Pouit asto pro skupinu konstantnch etzc
nap. dny v tdnu char* dayNames[] = {"Pondeli", "Utery", "Streda"};
pole se temi polokami typu char* dayNames[0] ukazuje na konstantn etzec "Pondeli"
vod do C, 8.10.2013
PB071
char myString2[] = "Hello"; myString2[strlen(myString2)] = '!'; puts(myString2); char myString3[] = "Hello"; strncpy(myString3, "Hello world", sizeof(myString3)); char myString4[] = "Hello"; char myString5[strlen(myString4)]; strcpy(myString4, myString5); char myString6[] = "Hello"; if (myString6 == "Hello") { } char* dayNames[] = {"Pondeli", "Utery", "Streda"}; puts(dayNames[0]); strcpy(dayNames[0], "Ctvrtek"); } vod do C, 8.10.2013
PB071
vod do C, 8.10.2013
PB071
A chceme mt kontrolu pmo od pekladae! Explicitn vyznaujeme promnnou, kter nebude mnna
jej hodnota by nemla bt mnna argument, kter nem bt ve funkci mnn
vod do C, 8.10.2013
PB071
vod do C, 8.10.2013
PB071
PB071
etzcov literly
printf("ahoj");
etzec ahoj je uloen ve statick sekci je typu char*, ale zrove ve statick sekci
pi zpisu pravdpodobn pd programu
char* konstReturnValueDemo() {return "Unmodifiable string"; } const char* konstReturnValueDemo2() {return "Unmodifiable string"; } void demoConst() { char* value = konstReturnValueDemo(); // read-only memory write - problem value[1] = 'x'; char* value2 = konstReturnValueDemo2(); // error: invalid conversion }
PB071
const ukazatel
Konstantn je pouze hodnota oznaen promnn
plat i pro ukazatel vetn dereference int value = 10; const int* pValue = &value;
PB071
vod do C, 8.10.2013
PB071
Shrnut
Pole nutn chpat souvislost s ukazatelem etzce pozor na koncovou nulu Pole a etzce pozor na nechtn pepis pamti const zlepuje itelnost kdu a celkovou bezpenost
vod do C, 8.10.2013
PB071