Uzupełnienie dot. przekazywania argumentów

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

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

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

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

Wskaźniki. Informatyka

Czy procesor musi się grzać?

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

Lab 9 Podstawy Programowania

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

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

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

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

Programowanie Proceduralne

Wskaźniki. Programowanie Proceduralne 1

Struktury czyli rekordy w C/C++

Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe.

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

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

Podstawy programowania komputerów

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

Informatyka. Wy-03 Dynamiczna alokacja pamięci, wyjątki. mgr inż. Krzysztof Kołodziejczyk

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

Wskaźniki w C. Anna Gogolińska

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.

Programowanie w języku C++

Wskaźniki. Pamięć dynamiczna

Stałe, tablice dynamiczne i wielowymiarowe

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

4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu.

Struktury. Przykład W8_1

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

Podstawy programowania w języku C++

Techniki Programowania wskaźniki 2

Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

Wstęp do programowania 1

Powyższe wyrażenie alokuje 200 lub 400 w zależności od rozmiaru int w danym systemie. Wskaźnik wskazuje na adres pierwszego bajtu pamięci.

Bardzo szybkie podsumowanie: wykład 3

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Język ANSI C tablice wielowymiarowe

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

Podstawy programowania w języku C++

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

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

Wykład 1: Wskaźniki i zmienne dynamiczne

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

Podstawy programowania w języku C++

Język ANSI C. część 11. Jarosław Gramacki Instytut Informatyki i Elektroniki

Ghost in the machine

Pobieranie argumentów wiersza polecenia

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

Alokacja pamięci dla tablicy dwuwymiarowej

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Część 4 życie programu

Języki i metody programowania I

Biblioteka standardowa - operacje wejścia/wyjścia

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

Podstawy informatyki. Wykład nr 1 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

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

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

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

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

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

Zmienne, stałe i operatory

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

Wstęp do Programowania, laboratorium 02

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

Spis treści JĘZYK C - WSKAŹNIKI, DYNAMICZNY PRZYDZIAŁ PAMIĘCI. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Podstawy Programowania 2 Wskaźniki i zmienne dynamiczne. Plan. Wskaźniki - krótka powtórka. Wskaźniki - krótka powtórka Wartości wskaźników.

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Języki i paradygmaty programowania 1 studia niestacjonarne 2018/19

Podstawy programowania w języku C++

Język C zajęcia nr 11. Funkcje

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

. Podstawy Programowania 2. Wskaźniki i zmienne dynamiczne. Arkadiusz Chrobot. 25 lutego 2019

Argumenty wywołania programu, operacje na plikach

Stałe i zmienne znakowe. Stała znakowa: znak

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

Podstawy programowania w języku C++

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

//zmienne globalne int *pa, *pb; //wskaźniki globalne void main(void) { clrscr(); printf("\n podaj wartosc liczby a\n"); scanf("%d",&a); pa=&a;

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

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

Języki programowania obiektowego Nieobiektowe elementy języka C++

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

PODSTAW PROGRAMOWANIA WYKŁAD 6 WSKAŹNIKI

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

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

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

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

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

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

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

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

Transkrypt:

Uzupełnienie dot. przekazywania argumentów #include <stdio.h> #include <stdlib.h> struct nowa { int f; char line[20000]; int k; } reprezentant; int main() { void funkcja7( struct nowa x); reprezentant.k=17; funkcja7(reprezentant); printf(" reprezentant.k= %d\n",reprezentant.k); exit(0); } /* koniec funkcji main */ 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 */ 1

Program wypisze: Uzupełnienie dot. przekazywania argumentów funkcja7 x.k=17 funkcja7 x.k=-18 reprezentant.k= 17 Wniosek: w programie wywołującym nie ma zmiany argumentu 2

Uzupełnienie dot. przekazywania argumentów #include <stdio.h> #include <stdlib.h> int nowa[10000]; int main() { void funkcja6( int a[10000] ); nowa[10]=27; funkcja6( nowa ); printf("a[10]=%6d\n",nowa[10]); exit(0); } /* koniec funkcji main */ void funkcja6( int a[10000] ) { printf("\n funkcja6 a[10]=%d\n",a[10]); a[10]=-18; printf("\n funkcja6 a[10]=%d\n",a[10]); }/* koniec funkcji funkcja6 */ 3

Program wypisze: Uzupełnienie dot. przekazywania argumentów funkcja6 a[10]=27 funkcja6 a[10]=-18 a[10]= -18 Wniosek: w programie wywołującym jest zmiana argumentu! 4

Przykład wskaźnik do struktury #include <stdio.h> #include <stdlib.h> struct alfa { char buf[16*16*16]; /* 4096 */ int k; }; typedef struct alfa koral; koral array[10]; koral * wskaznik; int main() { wskaznik = array; printf("%p\n",wskaznik); wskaznik++; printf("%p\n",wskaznik); exit(0); }/* koniec main */ 5

Program wypisze: Przykład wskaźnik do struktury 0x8049640 0x804a644 Wniosek: wskaźnik (jego zawartość) zmodyfikowała się o ilość bajtów potrzebnych na jeden element typu, na który może wskazywać Uwaga: niech program sam wylicza, jaka ilość bajtów jest potrzebna! 6

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. 7

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!) 8

Wskaźnik powinien na coś wskazywać (choćby na NULL) float * f4 = NULL; /* trzeba uważać by obiekt wskazywany nie zniknął!! */ 9

malloc (dynamiczna alokacja pamięci) - malloc3.c #include <stdio.h> #include <stdlib.h> struct st { int pole1; int pole2; float pole3; double buf[100000]; } z1, *p1, *p2; { main() p1= &z1; p1->pole1=11.; p1->pole2=13.; p1->pole3=15.; printf("\n"); printf(" pole1 %5d pole2 %5d pole3 %11.3f\n",z1.pole1,z1.pole2,z1.pole3); printf(" sizeof...%d \n\n",sizeof(z1) ); while(1) { p2=malloc(sizeof(z1)); if( p2==null) { printf("\n...zabraklo pamieci..."); break; } (*p2).pole1=21; (*p2).pole2=22; (*p2).pole3=23; /* free(p2);*/ } 10

malloc void * malloc (size_t size) funkcja ta zwraca wskaźnik do nowo zaalokowanego bloku pamięci o długości w bajtach size ; w przypadku niepowodzenia funkcja zwraca wskaźnik zerowy NULL uwaga blok pamięci pozostaje niezainicjalizowany (tzn. jego zawartość jest niezdefiniowana) 11

void free (void *ptr) free funkcja ta zwalnia (dealokuje) blok pamięci który został przydzielony przez malloc, wskazywany przez ptr 12

realloc void * realloc (void *ptr, size_t newsize) Funkcja ta zmienia wielkość bloku którego adres jest ptr nową wielkością jest newsize. Uwaga ponieważ przestrzeń za końcem bloku może być zajęta, realloc może dokonać kopiowania bloku pamięci do nowego adresu, tam gdzie jest więcej wolnej pamięci. realloc zwraca adres bloku; jak widać nie musi to być adres ptr. Jeśli się nie uda zmienić wielkości bloku pamięci, to wtedy realloc zwraca wskaźnik zerowy NULL. Jeśli ptr będzie wskaźnikiem o wartości NULL, to realloc zadziała tak jak malloc(newsize). 13

Wskaźnik do struktury struct nowa { float f1; char line[20000]; int k; } reprezentant; struct nowa * pf; pf = & reprezentant; (*pf).f1=33.4 ; /* nawiasy są konieczne */ (*pf).k = 17; pf -> k =34; /* operator wskaźnika struktury */ 14

Wskaźnik do struktury-2 struct faa *ptr; ptr = (struct faa *) malloc (sizeof (struct faa)); if (ptr == 0) abort (); memset (ptr, 0, sizeof (struct faa)); /* memset służy do inicjalizowania pamięci */ 15

Wskaźnik do struktury-3 #include <stdio.h> #include <stdlib.h> { int main() struct nowa { int f; char line[20000]; int k; } reprezentant; struct nowa * pf;... 16

Wskaźnik do struktury-4... pf = malloc(sizeof(struct nowa) ); memset(pf,1, sizeof(struct nowa) ); /* memset(pf,0, sizeof(struct nowa) ); */ printf("\n %d %d %d\n",pf->f, pf->line[10], pf->k); } /* koniec funkcji main */ wynik programu 16843009 1 16843009 17

calloc void * calloc (size_t count, size_t eltsize) funkcja zwraca blok pamięci dostatecznie długi aby mógł pomieścić count elementów, każdy o długości eltsize ; zawartość pamięci jest zerowana! (tzn. inicjalizowana zerami) 18

calloc void * calloc (size_t count, size_t eltsize) void * calloc (size_t count, size_t eltsize) { size_t size = count * eltsize; void *value ; value = malloc (size); if (value!= 0) memset (value, 0, size); return value; } /* koniec funkcji calloc */ 19

memset void * memset (void *block, int c, size_t size) funkcja kopiuje wartość c (jako unsigned char) do size pierwszych bajtów, począwszy od adresu wskazywanego przez wskaźnik block (czyli do bloku pamięci wskazywanego przez wskaźnik block) PRZYKŁAD: struct nowa * pf; void * wsk; pf = malloc ( sizeof (struct nowa) ); wsk = memset(pf,1, sizeof(struct nowa) ); printf("\n\n pf, wsk %p %p\n",pf,wsk); 20

memset void * memset (void *block, int c, size_t size) W przypadku powodzenia memset() zwraca wskaźnik równy wskaźnikowi block 21

memset void * memset (void *block, int c, size_t size) memset najczęściej używa się w stosunku do pamięci dynamicznie przydzielonej przez malloc (czy calloc), ale można jej użyć także do np. wyzerowania większej struktury danych (przykład poniżej) 22

memset void * memset (void *block, int c, size_t size) /* przyklad inicjalizowania pamieci przygotowanej dla macierzy structur */ #include <stdio.h> #include <stdlib.h> struct nowa { int f; char line[992]; int k; /* alfa[] zdefiniowana statycznie*/ } alfa[100]; /* kontynuacja na następnej stronie */ 23

memset void * memset (void *block, int c, size_t size) int main() { alfa[10].k= -223; printf("%d\n",alfa[10].k); memset(alfa,0,sizeof(alfa)); printf("%d %d\n",alfa[10].k, sizeof(alfa)); exit(0); }/* koniec funkcji main*/ /* wydruk -223 0 100000 */ 24

memcpy Function: void * memcpy (void *to, const void *from, size_t size) The memcpy function copies size bytes from the object beginning at from into the object beginning at to. The behavior of this function is undefined if the two arrays to and from overlap; use memmove instead if overlapping is possible. The value returned by memcpy is the value of to. Here is an example of how you might use memcpy to copy the contents of an array of struct foo : struct foo *old, *new; int arraysize;... 25 memcpy (new, old, arraysize * sizeof (struct foo));

mempcpy Funkcja: void * mempcpy (void * to, void * from, size_t size) mempcpy jest bardzo podobna do funkcji memcpy. Kopiuje size bajtów z miejsca wskazywanego przez from do miejsca wskazywanego przez to. Jednakże w przypadku sukcesu zwraca wskaźnik do bajtu następującego po ostatnim zapisanym bajcie, to znaczy zwraca ( (void *) ( (char *) to + size) ) 26

memmove Function: void * memmove (void *to, const void *from, size_t size) memmove copies the size bytes at from into the size bytes at to, even if those two blocks of space overlap. In the case of overlap, memmove is careful to copy the original values of the bytes in the block at from, including those bytes which also belong to the block at to. 27

przykład dynamicznej alokacji macierzy dwuwymiarowej program malloc9b.c (na osobnym zbiorze) 28

. Jak czytać skomplikowane deklaracje? ( Symfonia C++ J.Grębosz, 8.17.1) void zz ( int (*aa) (float), float t ); /* co to jest za obiekt? */ 29

Jak czytać skomplikowane deklaracje? ( Symfonia C++ J.Grębosz, 8.17.1) 1. Zaczynamy czytanie od nazwy tego co jest deklarowane. 2. Od tej nazwy posuwamy się w prawo. To dlatego, że tam mogą stać najmocniejsze (jeśli chodzi o priorytet) operatory: operator wywołania funkcji (...) bądź operator indeksowania tablicy []. 3. Jeśli w prawo już nic nie ma, lub natkniemy się na zamykający nawias wówczas zaczynamy czytanie w lewo. Kontynuujemy tak długo, dopóki wszystkiego nie przeczytamy, lub dopóki nie natkniemy się na zamykający nawias. 4. Jeśli napotkamy taki nawias, to wychodzimy z czytaniem na zewnątrz nawiasu. Znowu zaczynamy czytać w prawo, czyli wracamy do punktu 2. 5. I tak dalej, dopóki nie przeczytamy wszystkiego w tej deklaracji. 30

Jak czytać skomplikowane deklaracje? ( Symfonia C++ J.Grębosz, 8.17.1) Jak czytamy? Słownik! * jest wskaźnikiem mogącym pokazywać na... (typ1,typ2,...) jest funkcją wywoływaną z argumentami typ1, typ2... [n] jest n-elementową tablicą... 31

float * fp; Jak czytać skomplikowane deklaracje? ( Symfonia C++ J.Grębosz, 8.17.1) char * tan (float p, int s); char (* tas ) (float p, int s); char * (* tas) (float p, int s); 32

Jak czytać skomplikowane deklaracje? ( Symfonia C++ J.Grębosz, 8.17.1) int ( * (*fw) (int a, char * b) ) [2] ; 33

Jak czytać skomplikowane deklaracje? struct kos { float as; int k[10000]; } kos1; struct kos kos2; struct kos *fp1; struct kos (*fp2); struct kos (*fp3)(int a, int b); struct kos * (*fp4[6])( struct kos *a, struct kos (*b)(void) ); 34

Jak czytać skomplikowane deklaracje? float * fw [6] (int a); /* tego powyżej kompilator zbudować nie potrafi... */ /* ale właściwie nie jest to potrzebne */ /* natomiast kompilator potrafi zbudować poniższy obiekt*/ char (* fp) [20]; /* czy może być przydatny? */ 35

argumenty wiersza poleceń funkcja main ma dwa argumenty int main(int argc, char * argv [ ] ) (ich nazwy to argc, argv, tak są zwyczajowo nazywane, choć nie są to nazwy obowiązujące) 36

argumenty wiersza poleceń #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main (int argc, char *argv[] ) /* albo int main( int argc, char **argv) */ { int n; for(n=0;n<argc; ++n) { printf("\n n=%d param= %s",n, argv[n]); printf("\n to samo... n=%d param= %s",n, *(argv+n) ); printf("\n"); } exit(0); } /* koniec funkcji main */ 37