IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje



Podobné dokumenty
Př. další použití pointerů

Pointery II. Jan Hnilica Počítačové modelování 17

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

11a Dynamické dvourozměrné pole (obdobně vícerozměrné)

Programování v C++, 2. cvičení

Základy programování (IZP)

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Základy programování (IZP)

IUJCE 07/08 Přednáška č. 6

Operační systémy. Cvičení 3: Programování v C pod Unixem

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Základy programování (IZP)

IUJCE 07/08 Přednáška č. 1

Algoritmizace a programování

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

4. Typ ukazatel, strukturované datové typy

Zápis programu v jazyce C#

Ukazatele, dynamická alokace

Základy programování (IZP)

Např.: // v hlavičkovém souboru nebo na začátku // programu (pod include): typedef struct { char jmeno[20]; char prijmeni[20]; int rok_nar; } CLOVEK;

IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Operační systémy. Cvičení 4: Programování v C pod Unixem

Ukazatele a pole. Chceme-li vyplnit celé pole nulami, použijeme prázdný inicializátor: 207 Čárka na konci seznamu inicializátorů

Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

Množina čísel int stl-set-int.cpp

Odvozené a strukturované typy dat

Dynamická vícerozměrná pole. Základy programování 2 Tomáš Kühr

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

Vícerozměrná pole. Úvod do programování 2 Tomáš Kühr

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Dynamická alokace paměti

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Struktura programu v době běhu

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Programovací jazyk C++ Hodina 1

Základní datové struktury

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

Základy C++ I. Jan Hnilica Počítačové modelování 18

Základy programování (IZP)

Výrazy, operace, příkazy

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Základy programování (IZP)

PB071 Programování v jazyce C Jaro 2015

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

Pole a kolekce. v C#, Javě a C++

Práce s polem a pamětí

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Výrazy, operace, příkazy

Základy programování (IZP)

2 Datové typy v jazyce C

Proměnná a její uložení v paměti

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

PROGRAMOVÁNÍ V C++ CVIČENÍ

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Programování v jazyce C a C++

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Úvod do programování. Lekce 1

Mělká a hluboká kopie

Algoritmizace a programování

Programovací jazyk Pascal

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

Funkce, intuitivní chápání složitosti

PREPROCESOR POKRAČOVÁNÍ

Programovanie v jazyku C - funkcie a makra

IUJCE Přednáška č. 1. programování v C na vyšší úrovni základy objektově orientovaného programovaní v (C++, C#)

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) 28. prosince Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Data, výrazy, příkazy

Programování v C++ 1, 1. cvičení

Formátové specifikace formátovací řetězce

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

přetížení operátorů (o)

Opakování programování

PŘETĚŽOVÁNÍ OPERÁTORŮ

8 Třídy, objekty, metody, předávání argumentů metod

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

Jazyk C++, některá rozšíření oproti C

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

- jak udělat konstantu long int: L long velka = 78L;

PB161 Programování v jazyce C++ Přednáška 4

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

Transkript:

Konstanty I možnosti: přednostně v paměti neexistuje žádný ; o preprocesor (deklarace) #define KONSTANTA 10 o konstantní proměnná (definice) const int KONSTANTA = 10; příklad #include <stdio.h> v paměti existuje #define PI 3.141592 #define N 10 #define POZDRAV "ahoj" int main(int argc, char* argv[]) { double R, O; int i; O = 2 * PI * R; // O = 2 * 3.141592 * R; for(i = 0; i < N; i++) // for(i = 0; i < 10; i++) // neco printf(pozdrav); // printf("ahoj"); Datový typ pointer obsah (hodnota) = adresa v paměti využití přístup k jiným proměnným o pole, řetězce o funkce (pointer na funkci, volání odkazem) o dynamické proměnné Deklarace pointeru vždy svázán s datovým typem syntaxe: datovy_typ *identifikator double *pa, *pb; unsigned char *pcislo1; Pozor: double *pa, pb; // pointer na double, promenna double!!! 1

Referenční operátor & vrací adresu proměnné žádná * int prom = 123, *pprom; pprom = &prom; ukazuje na prom inicializace pointeru v definici int prom = 10, *pprom = &prom; & lze používat v programu libovolně double prom1, cislo; double *pprom = &prom1; // pprom ukazuje na Prom1 Cislo = 156*Prom1; // nejaka operace pprom = &Cislo; // pprom nyni ukazuje na cislo Dereferenční operátor * vrací hodnotu paměťového místa, na které ukazuje pointer: int prom = 123, *p = &prom, cislo; cislo = *p + 10; // cislo = 123 + 10 *p = 58; // prom = 58 printf("prom = %d", *p); // tisk prom významy *: násobení, dereference, definice proměnné typu pointer Poznámky: vysvětlení scanf() o hlavička argument typu adresa scanf("format", *promenna) o volání int prom; scanf("%d", &prom) adresa prom 2

Důsledky chyb (vynecháno): int prom = 123, *p = &prom, cislo; p ukazuje na adr. 58 *p = 58; *p = 23; adresa prom + 10 adr. 58 = 23 pád programu cislo = *p + 10; tisk adresy proměnné printf("hodnota = %d", *pprom); p = &cislo; viz nemíchat proměnné, pointery různých datových typů (typová konverze) int *pprom; double Cislo; pprom = &Cislo; // Chyba (warning prekladace) Práce s datovým typem pointer na příklady formálního zápisu normální dat. typ pointer definice proměnné int prom int *pointer přetypování (char)prom (char *)pointer sizeof sizeof(int) sizeof(int *) návratová hod. funkce int Funkce(... int * Funkce(... velikost pointeru vs. datového typu Win32, Linux (32b CPU, AS) sizeof(char) 1 1 sizeof(int) 4 2 sizeof(double) 8 8 sizeof(char *) 4 2 sizeof(int *) 4 2 sizeof(double *) 4 2 Nulový pointer konstanta NULL (obvykle #define NULL 0) NULL pointer = neukazuje nikam lze přiřadit všem typům pointerů AVR (8b CPU, 16b AS) 3

Pointer na pointer princip použití int prom; int *pprom; int **ppprom; pprom = &prom; ppprom = &pprom; // ukazuje na prom // take ukazuje na prom scanf("%d", *ppprom); // nacte do prom printf("%d", **ppprom); // vytiskne prom pprom = NULL; // neukazuji nikam ppprom = NULL; dereferencování pointeru: o ppprom pointer na pointer na int o *ppprom pointer na int o **ppprom proměnná typu int Pointerová aritmetika dále předpoklad: 32 b platforma (sizeof(int) 4, sizeof(int *) 4), adresace po B definované matematické operace s pointerem: o součet pointeru a celého čísla: + (bin), ++ o rozdíl pointeru a celého čísla: (bin), -- o rozdíl dvou pointerů (součet nelze!!!) o porovnání pointerů: > >= ==!= < <= pouze teoretické úvahy, v praxi používat jen u polí (viz dále) přičítání a odečítání celého čísla k pointeru #define K hodnota TYP *pointer; o platí pointer + K pointer K posun o K paměťových míst nahoru (int)pointer + K*sizeof(TYP) (int)pointer K*sizeof(TYP) o příklady: 4

int *pint = 100; // POZOR, jen teoreticky double *pdouble = 200; // POZOR, jen teoreticky // dále předpoklad: // sizeof(int) = 4 // sizeof(double) = 8 pint++; // pint bude 104 pdouble = pdouble - 10; // pdouble bude 120 = 200-10*8 o velmi časté použití rozdíl dvou pointerů o výsledek Datový typ pole 1D pole Definice Inicializace celé číslo ( o kolik prvků se pointery liší ) datovy_typ identifikator[pocet_prvku]; o Příklady: double teplota[7]; unsigned int mojepole[10000]; statické pole počet prvků nelze během práce programu měnit double teplota[7] = {1, 2, -5.35, 0.1245, 4, 43, -11; neinicializované pole pokud: o počet inicializací > počet prvků prvky nedefinovaná hodnota Error překladače o počet inicializací < počet prvků překladač zbývající prvky inicializuje na 0 (0.0) musí být známo v době překladu Práce s prvky prostřednictvím indexů int teplota[7]; printf("%d", teplota[3]); teplota[2*k+1] = 10; výraz / paměťové místo typu int o indexy 0, 1,..., pocet_prvku 1 o meze nekontrolovány (hrozí přetečení nebo podtečení indexů) = možný pád programu pole v sobě nenese informaci o své délce příklad 5

#define POCET_PRVKU 7 double teplota[pocet_prvku]; int i; for(i = 0; i < POCET_PRVKU; i++) { printf("zadej T pro %d.den: ", i+1); scanf("%lf", &teplota[i]); for(i=0; i < POCET_PRVKU; i++) { printf("teplota[%d] = %lf\n", i+1, teplota[i]); Vícerozměrná pole Definice = jednorozměrné pole, jehož prvky jsou pole datovy_typ id[pocetprvku1][pocetprvku2][pocetprvku3]...; např. int pole[4][5]; Inicializace int Pole[2][3] = {{11,12,13, {21,22,23; Práce Příklad: Součet dvou matic #define M 3 #define N 2 int A[M][N] = {{11,12, {21,22, {31,32; int B[M][N] = {{11,12, {21,22, {31,32; int i, j, C[M][N]; for(i = 0; i < M; i++) { for(j = 0; j < N; j++) { C[i][j] = A[i][j] + B[i][j]; Uložení pole v paměti a pointerová aritmetika 1D pole int pole[3]; 6

skutečná adresa v paměti Pro adresy platí: pole == pole+0 == &pole[0] pole+i == &pole[i] přístup k prvkům pole o přes indexy: pole[i] o pointery: *(pole + i) pointer typu pole je konstantní Q1: Je následující kód OK? rozumné využití pointerové aritmetiky nelze jej změnit (fyzicky neexistuje) int *pint; int pole[3]; pint = pole; pint[2] = 999; výraz typu int * Q2: Je následující kód OK? int *pint; int pole[3]; pole = pint; Příklad: vynulování pole přes pointery #define N 3 int pole[n] = {10,10,10; int *p = pole; while (p < (pole + N)) *p++ = 0; 7

Vícerozměrná pole v paměti po řádcích za sebou: int pole[2][3]; pointer na řádek příklady přístupu do pole: int pole[2][3] = {0; int *ppole; pole[0][1] = 10; // pres indexy *(*(pole + 1) + 2) = 15; // pole[1][2] *(pole[1]+1) = 64; // pole[1][1] // dukaz radkoveho usporadani ppole = pole; // compiler warning *(ppole+3) = -88; // pole[1][0] nedělat 8