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.

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

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

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

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

Wskaźniki. Informatyka

DYNAMICZNE PRZYDZIELANIE PAMIECI

Podstawy programowania komputerów

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

Tablice, funkcje - wprowadzenie

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

Stałe, tablice dynamiczne i wielowymiarowe

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

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

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

Programowanie w języku C++

Podstawy programowania w języku C++

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

Zmienne i struktury dynamiczne

Uzupełnienie dot. przekazywania argumentów

Wskaźniki w C. Anna Gogolińska

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:

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

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

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

Wskaźniki. Programowanie Proceduralne 1

ŁAŃCUCHY W JĘZYKU C/C++

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

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

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Podstawy programowania w języku C++

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

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

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

Lab 9 Podstawy Programowania

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

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Struktury, unie, formatowanie, wskaźniki

6 Przygotował: mgr inż. Maciej Lasota

Tablice deklaracja, reprezentacja wewnętrzna

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

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

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

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

Wprowadzenie do programowania w języku C

Struktury czyli rekordy w C/C++

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

Wstęp do programowania 1

5 Przygotował: mgr inż. Maciej Lasota

ZASADY PROGRAMOWANIA KOMPUTERÓW

Podstawy programowania skrót z wykładów:

Podstawy programowania 1

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Podstawy programowania w języku C++

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Ghost in the machine

Programowanie Proceduralne

Część 4 życie programu

Język C zajęcia nr 11. Funkcje

Podstawy Programowania. Zmienne dynamiczne, struktury, moduły programowe

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

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Podstawy programowania w języku C++

2 Przygotował: mgr inż. Maciej Lasota

dr inż. Jarosław Forenc

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

Zmienne, stałe i operatory

Języki i metodyka programowania. Wprowadzenie do języka C

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Język ANSI C tablice wielowymiarowe

Podstawy programowania w języku C++

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

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

Podstawy programowania

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

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

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

Tablice. int rozmiar; cout << Jaki ma być rozmiar tabeli? ; cin >> rozmiar; { int tablica[rozmiar]; /* TU JEST ŹLE */... }

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

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

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Wstęp do programowania

1 Podstawy c++ w pigułce.

Wprowadzenie do programowania w języku C

Wymiar musi być wyrażeniem stałym typu całkowitego, tzn. takim, które może obliczyć kompilator. Przykłady:

Język C, tablice i funkcje (laboratorium, EE1-DI)

Zasady programowania Dokumentacja

Tablice, funkcje, wskaźniki - wprowadzenie

Wstęp do Programowania, laboratorium 02

Wykład 4: Klasy i Metody

Podstawy programowania w języku C++

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

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

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

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

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

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

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wykład 3 Składnia języka C# (cz. 2)

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

Transkrypt:

1. Tablice dynamiczne Początkowa zadeklarowana wielkość tablicy czasami może okazać niewystarczająca, lub nadmierna. Dynamiczna alokacja pamięci wykorzystywana jest w celu otrzymania bądź zwolnienia pamięci podczas pracy programu. Istnieją cztery funkcje w bibliotece stdlib.h odpowiedzialne za dynamiczną alokację pamięci. Malloc() alokuje żądaną ilość bajtów i zwraca do wskaźnika adres pierwszego bajtu alokowanej przestrzeni. Nazwa malloc odnosi się do zwrotu memory allocation. Funkcja malloc() rezerwuje blok pamięci o podanym rozmiarze i zwraca wskaźnik typu pustego, który może być przypisany do wskaźnika dowolnego typu. wsk=(typ_danych*)malloc(rozmiar_w_bajtach); Powyżej wsk jest wskaźnikiem typu typ_danych. Funkcja malloc() zwraca wskaźnik do przestrzeni pamięci o rozmiarze rozmiar_w_bajtach. Jeśli nie wystarcza pamięci, alokacja jest nieudana i zwracany jest wskaźnik NULL. wsk=(int*)malloc(100*sizeof(int)); 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. Calloc() Alokuje przestrzeń dla elementów tablicowych, inicjuje do zera i zwraca wskaźnik do pamięci. Nazwa calloc odnosi się do zwrotu contigous allocation. Jedyną różnicą pomiędzy funkcjami malloc() i calloc() jest taka, że malloc() alokuje pojedynczy blok pamięci, a calloc() wiele bloków o tych samych rozmiarach i ustala wszystkie do zera. wsk=(cast-type*)calloc(n,element-size); Powyższe wyrażenie alokuje przyległą przestrzeń w pamięci dla tablicy n elementowej. wsk=(float*)calloc(25,sizeof(double)); Powyższy przykład tworzy w pamięci 25 bloków typu float o rozmiarze double. Free() dealokuje uprzednio alokowaną przestrzeń. Pamięć alokowana dynamicznie nie zwraca się samoczynnie. Programista musi użyć funkcji free() aby uwolnić pamięć. free(wsk); Powyższy przykład dealokuje wskaźnik pamięci. Reallock() Zmień rozmiar uprzednio alokowanej pamięci. Przydatny, gdy alokowana wcześniej pamięć jest nie wystarczająca lub nadmierna. wsk=realloc(wsk, nowy_rozmiar); W powyższym wyrażeniu wsk jest relokowane do rozmiaru nowy_rozmiar). Przykłady:

int main(void) int n,i,*ptr,sum=0; printf("wprowadz liczbe elementow: "); scanf("%d",&n); ptr=(int*)malloc(n*sizeof(int)); //alokacja pamieci if(ptr==null) printf("blad! Alokacja nie powiodla sie."); exit(0); printf("podaj wartosci kolejnych elementow tablicy: "); for(i=0;i<n;++i) scanf("%d",ptr+i); sum+=*(ptr+i); printf("sum=%d",sum); free(ptr); int main(void) int n,i,*ptr,sum=0; printf("wprowadz liczbe elementow: "); scanf("%d",&n); ptr=(int*)calloc(n,sizeof(int)); if(ptr==null) printf("blad! Alokacja nie powiodla sie."); exit(0); printf("podaj wartosci kolejnych elementow tablicy: "); for(i=0;i<n;++i) scanf("%d",ptr+i); sum+=*(ptr+i); printf("sum=%d",sum); free(ptr); int main(void) int *ptr,i,n1,n2; printf("enter size of array: "); scanf("%d",&n1); ptr=(int*)malloc(n1*sizeof(int)); printf("address of previously allocated memory: "); for(i=0;i<n1;++i) printf("%u\t",ptr+i); printf("\nenter new size of array: "); scanf("%d",&n2);

ptr=realloc(ptr, n2); for(i=0;i<n2;++i) printf("%u\t\n",ptr+i); 2. Ciągi znaków (String) Operacje na ciągach znaków są bardzo ważne. Niestety język C nie posiada dedykowanego typu string. W języku C stringiem nazywamy jednowymiarową tablicę typu char którą kończy znal null (\0). Dzięki temu, w teorii string może mieć nieskończoną długość. Jedynym ograniczeniem jest pamięć komputera. Przykładowa deklaracja: char slowo[7]= s, t, r, i, n, g, \0 ; char slowo[]= string ; Poniżej przedstawiono jak wygląda ciąg znaków(string) zdefiniowany w pamięci: Programista nie musi pamiętać o wstawianiu na końcu znaku null. Kompilator automatycznie dodaje \0 na końcu stworzonego stringa po przeanalizowaniu tablicy. W celu odczytania stringu należy skorzystać z kwantyfikatora formatowego %s. Dla lepszej obsługi ciągów znaków możliwe jest skorzystanie z biblioteki string.h wyposażonej w funkcje ułatwiające pracę na stringach. int main (void) char word[8] = 's', 't', 'r', 'i', 'n', 'g', 's', '\0'; printf("the program works with %s\n", word); W języku C możliwe jest korzystanie z następujących funkcji: strcpy(s1,s2) kopiuje string s2 do stringu s1 strcat(s1,s2) dołącza string s2 na koniec stringu s1

strlen(s1) zwraca długość stringu s1 strcmp(s1,s2) zwraca 0 jeśli s1 i s2 są takie same, mniej niż 0 jeśli s1<s2, więcej niż 0 jeśli s1>s2 strchr(s1, ch) zwraca wskaźnik to pierwszego wystąpienia znaki ch w stringu s1 strstr(s1,s2) zwraca wskaźnik do pierwszego wystąpienia stringu s2 w stringu s1 int main (void) char name[]="john", surname[]="price", temp[256], *temp2; int i; /*String display*/ printf("name: %s, Surname: %s \n", name, surname); /*string copying*/ strcpy(temp, name); printf("temp after use of strcpy(): %s\n", /*concentrating strings*/ strcat(temp, ""); strcat(temp, surname); printf("temp after use of strcat(): %s\n", /*changing all letters of the string into small letters*/ temp2=temp; while (*temp2) if (*temp2 >= 65 && *temp2 <=90) *temp2 += 32; temp2++; printf("temp after \"manual\" letter size change: %s\n", /*searching subseries in a string*/ temp2=strstr(temp, "ice"); if (temp2) printf("temp from seached subseries 'ice': %s\n", temp2); else printf("no subseries found\n"); /*obtaining the length of the strings*/ printf("length of temp: %ld\n", strlen(temp)); /*comparison of of strings*/ strcpy(temp, "Paul"); i=strcmp(name, if(i==0) printf("compared strings are thesame\n"); else if(i<0) printf("string %s appears before %s.\n", name, else if(i>0) printf("string %s appears after %s.\n", name, /* use of sprintf() instruction*/ sprintf(temp, "Name: %s, i: %d", name, i); printf("buffer : '%s'\n", Wczytywanie ciągów znaków od użytkownika: char string[20]; scanf( %s, string);

Tablica znakowa może pobierać pojedyncze słowa. Jeśli wprowadzona zostaje spacja (lub inny biały znak), scanf zostaje przerwany. int main(void) char name[20]; printf("enter name: "); scanf("%s",name); printf("your name is %s.",name);