nowe operatory &. (kropka) * operator rzutowy ->, (przecinek) sizeof

Podobne dokumenty
Czy procesor musi się grzać?

Uzupełnienie dot. przekazywania argumentów

Opisy funkcji /html_node/libc_528.html

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Języki i metodyka programowania. Wskaźniki i tablice.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Wstęp do programowania 1

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )

Tablice, funkcje - wprowadzenie

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Zmienne, stałe i operatory

Wstęp do wskaźników w języku ANSI C

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Programowanie Proceduralne

dr inż. Jarosław Forenc

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Zadanie 04 Ktory z ponizszych typow danych w jezyku ANSI C jest typem zmiennoprzecinkowym pojedynczej precyzji?

Tablice, funkcje, wskaźniki - wprowadzenie

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Wskaźniki w C. Anna Gogolińska

Programowanie Proceduralne

Wskaźniki. Programowanie Proceduralne 1

Język C zajęcia nr 11. Funkcje

Struktury Struktura polami struct struct struct struct

KURS C/C++ WYKŁAD 6. Wskaźniki

Słowa kluczowe i nazwy

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Funkcja (podprogram) void

Programowanie w elektronice: Podstawy C

PROGRAMOWANIE w C prolog

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Tablicę 2-wymiarową można przedstawić jako pewien zestaw tablic 1-wymiarowych np.:

KURS C/C++ WYKŁAD 7. struct Punkt { int x, y; int kolor; };

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Struktury czyli rekordy w C/C++

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Podstawy algorytmiki i programowania - wykład 4 C-struktury

IX. Wskaźniki.(3 godz.)

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Pliki. Informacje ogólne. Obsługa plików w języku C

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Biblioteka standardowa - operacje wejścia/wyjścia

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Podstawy programowania w języku C++

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Lab 9 Podstawy Programowania

Tablice wielowymiarowe. Przykład tablica 2-wymiarowa. Przykład. Przykład 3-wymiarowy. Tak naprawdę nie istnieją w C! Rozważmy tablicę o rozmiarze 3x2

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

Struktury - wprowadzenie

Wskaźniki. Informatyka

Wstęp do wskaźników i dynamicznej alokacji pamięci w językach ANSI C i C++

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

2 Przygotował: mgr inż. Maciej Lasota

( wykł. dr Marek Piasecki )

Język ANSI C tablice wielowymiarowe

C-struktury wykład. Dorota Pylak

Języki i metody programowania. Omówienie języków C, C++ i Java

WYKŁAD 4, 5 i 6. Wprowadzenie do języka C Mój pierwszy, drugi,..., n-ty program w języku C. Programy: c1_1.c... c1_9.c.

Język ludzki kod maszynowy

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Wstęp do Programowania, laboratorium 02

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

for (i=0; i<10; i=i+1) instrukcja; instrukcja zostanie wykonana 10 razy for (inicjalizacja; test; aktualizacja) instrukcja;

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Stałe, tablice dynamiczne i wielowymiarowe

6 Przygotował: mgr inż. Maciej Lasota

Programowanie strukturalne i obiektowe

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Składnia języka EPL. EUCIP Programming Language

Pola i metody statyczne

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Semafor ustaw_semafor(key_t nazwa, int start); Semafor usun_semafor(semafor sem); void signal(semafor sem); void wait(semafor sem);

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Wstęp. do języka C na procesor (kompilator RC51)

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Języki programowania - podstawy

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Wskaźniki. Pamięć dynamiczna

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Funkcja, argumenty funkcji

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Przeciążanie operatorów

ECLIPSE wnioski z dwóch pierwszych laboratoriów

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

PARADYGMATY PROGRAMOWANIA Wykład 4

Transkrypt:

nowe operatory &. (kropka) * operator rzutowy ->, (przecinek) sizeof 1

adres zmiennej Do pobrania adresu zmiennej używa się jednoargumentowego operatora & (uwaga & może mieć także znaczenie dwuargumentowego operatora bitowego iloczynu logicznego) Jednoargumentowy operator * jest używany do wskazywania, tzn. jego argument jest adresem zmiennej (*wskaźnik) (inna nazwa to operator dereferencji) 2

sizeof operator służy do uzyskania informacji o wielkości typu lub zmiennej ( w bajtach) struct alfa { char line[100]; float ff[100]; } kos; sizeof( struct alfa ); sizeof( float); sizeof( kos ); 3

-> jest to wskaźnik do elementu struktury wskaźnik -> element struktury uwaga: nie jest sprawdzane czy wskaźnik wskazuje na strukturę! pptr -> pole1; 4

operator rzutowy float f, *ptr_f; int n, *ptr_n; n = (float) f; f = (int) n; ptr_f = (float *) ptr_n; /* rzutowanie wskaźników */ ptr_n = (int *) n ; /* załadowanie konkretnego adresu */ 5

sizeof i struktura struct alfa {...lista...} reprezentant; sizeof (reprezentant); sizeof ( reprezentant. pole1 ); /* to odwołanie jest poprawne */ 6

. /* kropka */ -kropka nie została wymieniona jako operator wśród 15 grup operatorów, ale...jest operatorem dającym możliwość odwołania się do elementów struktury -należy do operatorów o najwyższym priorytecie 7

krótka dygresja nt. struktury struct jedyne operacje jakie można wykonać na strukturze to znalezienie jej adresu (za pomocą operatora &) i odwołanie się do jej elementów (z użyciem operatora. lub kombinacji operatorów * i. albo ich odpowiednika -> ) (w niektórych kompilatorach można przekazać strukturę jako argument funkcji - także w gcc z Free Software Foundation ) &alfa; alfa.pole ; (*ptr_alfa).pole; ptr -> pole ; 8

dygresja nt. struct #include <stdio.h> #include <stdlib.h> struct nowa { int f; char line[20000]; int k; }; int main() { struct nowa reprezentant; void funkcja7( struct nowa x); /* prototyp funkcji funkcja7 */ reprezentant.k=17; funkcja7(reprezentant); printf(" reprezentant.k %d\n",reprezentant.k); exit(0); /* gcc - struktura może być argumentem funkcji */ } /* koniec funkcji main */ 9

dygresja nt. struct void funkcja7( struct nowa x) { printf("\n funkcja7 x.k=%d\n",x.k); x.k=-18; printf("\n funkcja7 x.k=%d\n",x.k); }/* koniec funkcji funkcja7 */ 10

dygresja nt. struct - ciąg dalszy /* inicjalizacja struktur */ struct klasa{ int n3; float g4; char line[20]; };... typedef struct klasa typek; typek reprezentant1, reprezentant2={3,2.7, Krakus }; 11

dygresja nt. struct - ciąg dalszy do pól bitowych struktury nie można stosować operatora & (natomiast jest poprawnym odwołanie przez operator & do elementu struktury który nie jest polem bitowym) & (ptr->pole1); /* ptr jest wskaźnikiem do struktury */ 12

operator przecinkowy /* używany w celu grupowania instrukcji */ k=7,f=13.4, funkcja(z); k= (i=2, j=12, i*j); /* wartość powyższego wyrażenia wynosi 24 */ 13

operator przecinkowy /* używany w celu grupowania instrukcji */ for(n1=1, n2=1; n1<5 && n2<6; ++n1, ++n2) printf("\n n1=%d n2=%d\n", n1,n2); 14

operator spoza ortodoksyjnego C && /* adres etykiety ; operator && */ #include <stdio.h> #include <stdlib.h> int main() {float n=1; char c; void *fp; n: ; ++n; printf("\n n=%f\n",n); scanf("%c",&c); fp= && n; /* to załadowanie fp można umieścić wcześniej... */ goto *fp; } /* koniec funkcji main*/ 15

operator spoza ortodoksyjnego C && Jedną z możliwości użycia adresów etykiet jest zainicjalizowanie tablicy o klasie pamięci static; tablica ta będzie przechowywać te adresy jako adresy skoków. static void *array[] = { &&etyk1, &&etyk2, &&etyk3 }; goto *array[i]; /* oczywiście nie będzie sprawdzane czy array[i] zostało zainicjalizowane! */ 1.wydaje się, że instrukcja switch jest wystarczająco bogatym w możliwości rozgałęźnikiem 2.skoki wykonywać można tylko w ramach danej funkcji 16

funkcje zagnieżdżone tego nie ma w ANSI C int main() { float func(float w, float y); float a,b,c; b=4; c=3; a=func(b,c); printf("\n a=%f\n",a); exit(0); } /* koniec funkcji main*/ float func ( float x1, float x2) { float ff(float f1) { return(f1*f1); } /* koniec funkcji ff, lokalnej wewnatrz func */ return(ff(x1)+ff(x2)); } /* koniec funkcji func gcc ansi -pedantic nazwa zbioru 17 */

Wskaźniki Typ wskaźnika Wskaźnik uniwersalny (void *) Rzutowanie wskaźnika na wskaźnik (operatory rzutowe dla wskaźników) int * wsk1; float * wsk2; wsk1 = (int *) wsk2; /*rzutowanie*/ 18

Wskaźniki wskaźnik jako parametr wywołania funkcji wskaźnik jako argument zwracany przez funkcję (bardzo) bliskie pokrewieństwo tablica wskaźnik do niej 19

(wskaźniki a macierze) float as[10]; /* każdy element ma długość 4 bajtów */ float * p3; *(as) = 7.3 ; /* as[0]=7.3; */ *(as+5)=-4.5; /* as[5]=-4.5; */ /* dodawanie liczby całkowitej do wskaźnika skaluje się automatycznie */ 20

#define SIZE 5 (wskaźniki a macierze) void funkcja3( int as[size]); int main ( ) {int n; static int array[size]={0,1,2,3,4}; for(n=0;n<5;++n) printf(" %d", *(array+n) ); funkcja3(array); printf("\n\n po powrocie z funkcji funkcja3\n"); for(n=0;n<5;++n) printf(" %d", *(array+n) ); printf("\n"); exit(0); } /* koniec funkcji main*/ 21

void funkcja3( int as[size]) { as[3]=-3; }/* koniec funkcji funkcja3 */ (wskaźniki a macierze) 0 1 2 3 4 po powrocie z funkcji funkcja3 0 1 2-3 4 22

(wskaźniki a macierze) #define SIZE 5 void funkcja4( int as[size]); main() {int n; static int array[size]={0,1,2,3,4}; for(n=0;n<5;++n) printf(" %d", *(array+n) ); funkcja4(array); printf("\n\n po powrocie z funkcji funkcja4\n"); for(n=0;n<5;++n) printf(" %d", *(array+n) ); printf("\n"); } /* koniec funkcji main*/ 23

(wskaźniki a macierze) void funkcja4( int * as) {int n; printf("\n\n początek funkcji funkcja4\n"); for(n=0;n<5;++n) printf(" %d", *(as++) ); as+=-2; /* as=as-2; */ (*as)=-3; }/* koniec funkcji funkcja4 */ 24

0 1 2 3 4 (wskaźniki a macierze) początek funkcji funkcja4 0 1 2 3 4 po powrocie z funkcji funkcja4 0 1 2-3 4 25

main() (wskaźniki) { void funkcja5 ( float** ); float n,*fp; fp = & n; printf("\n poczatek main fp=%p &fp=%p\n", fp, &fp); funkcja5( &fp ); printf("\n koniec main fp=%p &fp=%p\n", fp, &fp); exit(0); } /* koniec funkcji main*/ void funkcja5(float ** wsk) { printf("\n poczatek funkcja5 *wsk=%p wsk=%p &wsk=%p\n", *wsk, wsk, &wsk); *wsk=null; printf("\n koniec funkcja5 *wsk=%p wsk=%p &wsk=%p\n", *wsk, wsk, &wsk); } /* koniec funkcji funkcja5 */ 26

(wskaźniki) wynik programu : poczatek main fp=0xbffffa64 &fp=0xbffffa60 poczatek funkcja5 *wsk=0xbffffa64 wsk=0xbffffa60 &wsk=0xbffffa5c koniec funkcja5 *wsk=(nil) wsk=0xbffffa60 &wsk=0xbffffa5c koniec main fp=(nil) &fp=0xbffffa60 27

Wskaźniki (wskaźnik do funkcji) Nazwa funkcji jest jednocześnie adresem jej początku czyli adresem miejsca w pamięci, gdzie zaczyna się kod odpowiadający instrukcjom tej funkcji. (czyli jest podobnie jak w przypadku tablic!) przykład : 28

#include <stdio.h> #include <stdlib.h> int main() { float func(float w, float y); float a, b=6, c=5; Wskaźniki (wskaźnik do funkcji) a=(*func) (b,c); exit(0); } /* koniec funkcji main*/ float func(float x1, float x2) { return ( x1 * x2 ); } /* koniec funkcji func */ printf("\n a=%f\n",a); 29