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

Podobne dokumenty
Tablice, funkcje, wskaźniki - wprowadzenie

Wskaźniki. Przemysław Gawroński D-10, p Wykład 1. (Wykład 1) Wskaźniki / 9

Tablice, funkcje - wprowadzenie

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

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

Podstawy programowania komputerów

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

Wskaźniki w C. Anna Gogolińska

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

Lab 9 Podstawy Programowania

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:

Wskaźniki. Informatyka

Wskaźniki. Programowanie Proceduralne 1

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

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

Programowanie w języku C++

Podstawy programowania w języku C++

Uzupełnienie dot. przekazywania argumentów

Stałe, tablice dynamiczne i wielowymiarowe

Podstawy programowania w języku C++

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

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

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

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

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

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

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.

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

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

Język C zajęcia nr 11. Funkcje

Język ANSI C tablice wielowymiarowe

Struktury czyli rekordy w C/C++

Wprowadzenie do programowania w języku C

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

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

Podstawy programowania w języku C++

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

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

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

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

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

Techniki Programowania wskaźniki

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

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

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

Zmienne, stałe i operatory

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

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

Podstawy programowania w języku C++

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

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

Wstęp do programowania

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

Bardzo szybkie podsumowanie: wykład 3

Biblioteka standardowa - operacje wejścia/wyjścia

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

Podstawy programowania w języku C++

Wykład 1: Wskaźniki i zmienne dynamiczne

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

Programowanie komputerowe. Zajęcia 4

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

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

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

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

Wykład 4: Klasy i Metody

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. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

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

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

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

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

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

Język C++ Różnice między C a C++

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

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

Funkcja (podprogram) void

Techniki Programowania wskaźniki 2

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

Podstawy programowania w języku C++

6 Przygotował: mgr inż. Maciej Lasota

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

dr inż. Paweł Myszkowski Wykład nr 8 ( )

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

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

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

PODSTAW PROGRAMOWANIA WYKŁAD 6 WSKAŹNIKI

Podstawy programowania 1

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. Pamięć dynamiczna

Ghost in the machine

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

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

Programowanie i struktury danych

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

Transkrypt:

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

Outline 1 Wskaźniki 2 Tablice a wskaźniki 3 Dynamiczna alokacja pamięci (Wykład 2) Wskaźniki 8 marca 2019 2 / 17

Wskaźniki Korzyści płynące ze wskaźników: (Wykład 2) Wskaźniki 8 marca 2019 3 / 17

Wskaźniki Korzyści płynące ze wskaźników: wskaźniki umożliwiają funkcjom modyfikowanie swoich argumentów, (Wykład 2) Wskaźniki 8 marca 2019 3 / 17

Wskaźniki Korzyści płynące ze wskaźników: wskaźniki umożliwiają funkcjom modyfikowanie swoich argumentów, wskaźniki są podstawą dynamicznej alokacji pamięci, (Wykład 2) Wskaźniki 8 marca 2019 3 / 17

Wskaźniki Korzyści płynące ze wskaźników: wskaźniki umożliwiają funkcjom modyfikowanie swoich argumentów, wskaźniki są podstawą dynamicznej alokacji pamięci, wskaźniki umożliwiają realizację dynamicznych struktur danych: listy, drzewa, itp, (Wykład 2) Wskaźniki 8 marca 2019 3 / 17

Wskaźniki Korzyści płynące ze wskaźników: wskaźniki umożliwiają funkcjom modyfikowanie swoich argumentów, wskaźniki są podstawą dynamicznej alokacji pamięci, wskaźniki umożliwiają realizację dynamicznych struktur danych: listy, drzewa, itp, wskaźniki pozwalają poprawić efektywność działania wielu procedur. (Wykład 2) Wskaźniki 8 marca 2019 3 / 17

Wskaźniki Wskaźnik to zmienna przechowująca adres innej zmiennej. (Wykład 2) Wskaźniki 8 marca 2019 4 / 17

Wskaźniki Wskaźnik to zmienna przechowująca adres innej zmiennej. Adres zmiennej to informacja o jej fizycznej lokalizacji w pamięci programu. (Wykład 2) Wskaźniki 8 marca 2019 4 / 17

Wskaźniki Wskaźnik to zmienna przechowująca adres innej zmiennej. Adres zmiennej to informacja o jej fizycznej lokalizacji w pamięci programu. Ogólna postać deklaracji wskaźnika: typ *nazwa; (Wykład 2) Wskaźniki 8 marca 2019 4 / 17

Wskaźniki Wskaźnik to zmienna przechowująca adres innej zmiennej. Adres zmiennej to informacja o jej fizycznej lokalizacji w pamięci programu. Ogólna postać deklaracji wskaźnika: typ *nazwa; Operator & zwraca adres w pamięci następującego po nim operandu. (Wykład 2) Wskaźniki 8 marca 2019 4 / 17

Wskaźniki Wskaźnik to zmienna przechowująca adres innej zmiennej. Adres zmiennej to informacja o jej fizycznej lokalizacji w pamięci programu. Ogólna postać deklaracji wskaźnika: typ *nazwa; Operator & zwraca adres w pamięci następującego po nim operandu. Operator * zwraca wartość zmiennej, znajdującej się pod adresem następującyn po operandzie. (Wykład 2) Wskaźniki 8 marca 2019 4 / 17

Wskaźniki Wskaźnik to zmienna przechowująca adres innej zmiennej. Adres zmiennej to informacja o jej fizycznej lokalizacji w pamięci programu. Ogólna postać deklaracji wskaźnika: typ *nazwa; Operator & zwraca adres w pamięci następującego po nim operandu. Operator * zwraca wartość zmiennej, znajdującej się pod adresem następującyn po operandzie. Na wskaźnikach można wykonywać tylko dwie operacje arytmetyczne: dodawanie i odejmowanie. (Wykład 2) Wskaźniki 8 marca 2019 4 / 17

Wskaźniki Wskaźnik to zmienna przechowująca adres innej zmiennej. Adres zmiennej to informacja o jej fizycznej lokalizacji w pamięci programu. Ogólna postać deklaracji wskaźnika: typ *nazwa; Operator & zwraca adres w pamięci następującego po nim operandu. Operator * zwraca wartość zmiennej, znajdującej się pod adresem następującyn po operandzie. Na wskaźnikach można wykonywać tylko dwie operacje arytmetyczne: dodawanie i odejmowanie. Operacje wskaźnikowe wykonywane są z uwzględnieniem typu podstawowego wskaźnika. (Wykład 2) Wskaźniki 8 marca 2019 4 / 17

Tablice i adresy - arytmetyka wskaźników # define SIZE 8 int itab [ SIZE ], * pit = itab ; // int * pit =& itab [0]; double dtab [ SIZE ], * pdt = dtab ; printf (" %18 s %15 s\n", " int ", " double "); for ( int i = 0; i < SIZE ; i ++) // gnu11 printf (" wsk + %d %10 p %10 p\n",i,pit +i,pdt +i); (Wykład 2) Wskaźniki 8 marca 2019 5 / 17

Tablice i adresy - arytmetyka wskaźników # define SIZE 8 int itab [ SIZE ], * pit = itab ; // int * pit =& itab [0]; double dtab [ SIZE ], * pdt = dtab ; printf (" %18 s %15 s\n", " int ", " double "); for ( int i = 0; i < SIZE ; i ++) // gnu11 printf (" wsk + %d %10 p %10 p\n",i,pit +i,pdt +i); int double wsk + 0 : 0x7fff36430c60 0x7fff36430c10 wsk + 1 : 0x7fff36430c64 0x7fff36430c18 wsk + 2 : 0x7fff36430c68 0x7fff36430c20 wsk + 3 : 0x7fff36430c6c 0x7fff36430c28 wsk + 4 : 0x7fff36430c70 0x7fff36430c30 wsk + 5 : 0x7fff36430c74 0x7fff36430c38 wsk + 6 : 0x7fff36430c78 0x7fff36430c40 wsk + 7 : 0x7fff36430c7c 0x7fff36430c48 (Wykład 2) Wskaźniki 8 marca 2019 5 / 17

Czym są tablice? W języku C dla tablic przewidziano tylko 2 operacje: (Wykład 2) Wskaźniki 8 marca 2019 6 / 17

Czym są tablice? W języku C dla tablic przewidziano tylko 2 operacje: określenie rozmiaru tablicy, (Wykład 2) Wskaźniki 8 marca 2019 6 / 17

Czym są tablice? W języku C dla tablic przewidziano tylko 2 operacje: określenie rozmiaru tablicy, uzyskanie adresu pierwszego elementu tablicy (o indeksie zerowym). (Wykład 2) Wskaźniki 8 marca 2019 6 / 17

Czym są tablice? W języku C dla tablic przewidziano tylko 2 operacje: określenie rozmiaru tablicy, uzyskanie adresu pierwszego elementu tablicy (o indeksie zerowym). Wszystkie pozostałe operacje są w istocie realizowane na wskaźnikach, nawet jeśli zapis sugeruje co innego, np. tab[i]. (Wykład 2) Wskaźniki 8 marca 2019 6 / 17

Czym są tablice? W języku C dla tablic przewidziano tylko 2 operacje: określenie rozmiaru tablicy, uzyskanie adresu pierwszego elementu tablicy (o indeksie zerowym). Wszystkie pozostałe operacje są w istocie realizowane na wskaźnikach, nawet jeśli zapis sugeruje co innego, np. tab[i]. W języku C nazwa tab odnosi się do adresu elementu tablicy tab[] o indeksie zero w każdym kontekście, z wyjątkiem jednego, kiedy to występuje jako argument operatora sizeof. (Wykład 2) Wskaźniki 8 marca 2019 6 / 17

Czym są tablice? W języku C dla tablic przewidziano tylko 2 operacje: określenie rozmiaru tablicy, uzyskanie adresu pierwszego elementu tablicy (o indeksie zerowym). Wszystkie pozostałe operacje są w istocie realizowane na wskaźnikach, nawet jeśli zapis sugeruje co innego, np. tab[i]. W języku C nazwa tab odnosi się do adresu elementu tablicy tab[] o indeksie zero w każdym kontekście, z wyjątkiem jednego, kiedy to występuje jako argument operatora sizeof. Zapis sizeof tab - reprezentuje rozmiar całej tablicy, a nie rozmiar wskaźnika jednego z jej elementów. (Wykład 2) Wskaźniki 8 marca 2019 6 / 17

Czym są tablice? int tab[100]; *tab = 18 - przypisujemy wartość elementowi o indeksie 0. (Wykład 2) Wskaźniki 8 marca 2019 7 / 17

Czym są tablice? int tab[100]; *tab = 18 - przypisujemy wartość elementowi o indeksie 0. *(tab + 5) = 18 - przypisujemy wartość elementowi o indeksie 5. (Wykład 2) Wskaźniki 8 marca 2019 7 / 17

Czym są tablice? int tab[100]; *tab = 18 - przypisujemy wartość elementowi o indeksie 0. *(tab + 5) = 18 - przypisujemy wartość elementowi o indeksie 5. *(tab + 5) = 18 - działa tak samo jak *(5 + tab) = 18. (Wykład 2) Wskaźniki 8 marca 2019 7 / 17

Czym są tablice? int tab[100]; *tab = 18 - przypisujemy wartość elementowi o indeksie 0. *(tab + 5) = 18 - przypisujemy wartość elementowi o indeksie 5. *(tab + 5) = 18 - działa tak samo jak *(5 + tab) = 18. tab[5] = 18 - przypisujemy wartość elementowi o indeksie 5. (Wykład 2) Wskaźniki 8 marca 2019 7 / 17

Czym są tablice? int tab[100]; *tab = 18 - przypisujemy wartość elementowi o indeksie 0. *(tab + 5) = 18 - przypisujemy wartość elementowi o indeksie 5. *(tab + 5) = 18 - działa tak samo jak *(5 + tab) = 18. tab[5] = 18 - przypisujemy wartość elementowi o indeksie 5. tab[5] = 18 - działa tak samo jak 5[tab]=18. (Wykład 2) Wskaźniki 8 marca 2019 7 / 17

Czym są tablice? int tab[100]; *tab = 18 - przypisujemy wartość elementowi o indeksie 0. *(tab + 5) = 18 - przypisujemy wartość elementowi o indeksie 5. *(tab + 5) = 18 - działa tak samo jak *(5 + tab) = 18. tab[5] = 18 - przypisujemy wartość elementowi o indeksie 5. tab[5] = 18 - działa tak samo jak 5[tab]=18. Notacja 5[tab] = 18 - działa, ale nie powinna być stosowana. (Wykład 2) Wskaźniki 8 marca 2019 7 / 17

Czym są tablice? int tab[100]; *tab = 18 - przypisujemy wartość elementowi o indeksie 0. *(tab + 5) = 18 - przypisujemy wartość elementowi o indeksie 5. *(tab + 5) = 18 - działa tak samo jak *(5 + tab) = 18. tab[5] = 18 - przypisujemy wartość elementowi o indeksie 5. tab[5] = 18 - działa tak samo jak 5[tab]=18. Notacja 5[tab] = 18 - działa, ale nie powinna być stosowana. Wyrażenie X[Y] jest równoważne wyrażeniu *(X+Y). (Wykład 2) Wskaźniki 8 marca 2019 7 / 17

Czym są tablice? int tab[100]; *tab = 18 - przypisujemy wartość elementowi o indeksie 0. *(tab + 5) = 18 - przypisujemy wartość elementowi o indeksie 5. *(tab + 5) = 18 - działa tak samo jak *(5 + tab) = 18. tab[5] = 18 - przypisujemy wartość elementowi o indeksie 5. tab[5] = 18 - działa tak samo jak 5[tab]=18. Notacja 5[tab] = 18 - działa, ale nie powinna być stosowana. Wyrażenie X[Y] jest równoważne wyrażeniu *(X+Y). Wyrażenie &X[Y] jest równoważne wyrażeniu X+Y. (Wykład 2) Wskaźniki 8 marca 2019 7 / 17

Tablice i wskaźniki char tab[] i char *p to to samo tylko w przypadku parametrów formalnych funkcji. (Wykład 2) Wskaźniki 8 marca 2019 8 / 17

Tablice i wskaźniki char tab[] i char *p to to samo tylko w przypadku parametrów formalnych funkcji. Deklaracja char tab[6] przydziela miejsce na 6 znaków i wiąże ten obszar z nazwą tab. (Wykład 2) Wskaźniki 8 marca 2019 8 / 17

Tablice i wskaźniki char tab[] i char *p to to samo tylko w przypadku parametrów formalnych funkcji. Deklaracja char tab[6] przydziela miejsce na 6 znaków i wiąże ten obszar z nazwą tab. Deklaracja char *p przydziela miejsce na 1 wskaźnik. Wskaźnik może wskazywać: (Wykład 2) Wskaźniki 8 marca 2019 8 / 17

Tablice i wskaźniki char tab[] i char *p to to samo tylko w przypadku parametrów formalnych funkcji. Deklaracja char tab[6] przydziela miejsce na 6 znaków i wiąże ten obszar z nazwą tab. Deklaracja char *p przydziela miejsce na 1 wskaźnik. Wskaźnik może wskazywać: na pojedynczą zmienną typu char, (Wykład 2) Wskaźniki 8 marca 2019 8 / 17

Tablice i wskaźniki char tab[] i char *p to to samo tylko w przypadku parametrów formalnych funkcji. Deklaracja char tab[6] przydziela miejsce na 6 znaków i wiąże ten obszar z nazwą tab. Deklaracja char *p przydziela miejsce na 1 wskaźnik. Wskaźnik może wskazywać: na pojedynczą zmienną typu char, na dowolny indeks w tablicy typu char, (Wykład 2) Wskaźniki 8 marca 2019 8 / 17

Tablice i wskaźniki char tab[] i char *p to to samo tylko w przypadku parametrów formalnych funkcji. Deklaracja char tab[6] przydziela miejsce na 6 znaków i wiąże ten obszar z nazwą tab. Deklaracja char *p przydziela miejsce na 1 wskaźnik. Wskaźnik może wskazywać: na pojedynczą zmienną typu char, na dowolny indeks w tablicy typu char, nigdzie - wskaźnik pusty. (Wykład 2) Wskaźniki 8 marca 2019 8 / 17

Tablice i wskaźniki Przykład: char tab[]= hello ; char *p = world ; (Wykład 2) Wskaźniki 8 marca 2019 9 / 17

Tablice i wskaźniki Przykład: char tab[]= hello ; char *p = world ; tab: 'h' 'e' 'l' 'l' 'o' '\0' (Wykład 2) Wskaźniki 8 marca 2019 9 / 17

Tablice i wskaźniki Przykład: char tab[]= hello ; char *p = world ; tab: 'h' 'e' 'l' 'l' 'o' '\0' p: 'w' 'o' 'r' 'l' 'd' '\0' (Wykład 2) Wskaźniki 8 marca 2019 9 / 17

Tablice i wskaźniki Przykład: char tab[]= hello ; char *p = world ; tab: 'h' 'e' 'l' 'l' 'o' '\0' p: 'w' 'o' 'r' 'l' 'd' '\0' Jak przetłumaczyć x[3]??? (Wykład 2) Wskaźniki 8 marca 2019 9 / 17

Tablice i wskaźniki Przykład: char tab[]= hello ; char *p = world ; tab: 'h' 'e' 'l' 'l' 'o' '\0' p: 'w' 'o' 'r' 'l' 'd' '\0' Jak przetłumaczyć x[3]??? tab[3] - weź adres tablicy tab dodaj do niego 3 i pobierz znak, (Wykład 2) Wskaźniki 8 marca 2019 9 / 17

Tablice i wskaźniki Przykład: char tab[]= hello ; char *p = world ; tab: 'h' 'e' 'l' 'l' 'o' '\0' p: 'w' 'o' 'r' 'l' 'd' '\0' Jak przetłumaczyć x[3]??? tab[3] - weź adres tablicy tab dodaj do niego 3 i pobierz znak, p[3] - weź adres wskaźnika p, pobierz jego wartość, dodaj do niej 3 i pobierz znak. Gdzie znajduje się x[3]??? (Wykład 2) Wskaźniki 8 marca 2019 9 / 17

Tablice i wskaźniki Przykład: char tab[]= hello ; char *p = world ; tab: 'h' 'e' 'l' 'l' 'o' '\0' p: 'w' 'o' 'r' 'l' 'd' '\0' Jak przetłumaczyć x[3]??? tab[3] - weź adres tablicy tab dodaj do niego 3 i pobierz znak, p[3] - weź adres wskaźnika p, pobierz jego wartość, dodaj do niej 3 i pobierz znak. Gdzie znajduje się x[3]??? tab[3] - znak odległy o 3 miejsca od początku obiektu o nazwie tab, (Wykład 2) Wskaźniki 8 marca 2019 9 / 17

Tablice i wskaźniki Przykład: char tab[]= hello ; char *p = world ; tab: 'h' 'e' 'l' 'l' 'o' '\0' p: 'w' 'o' 'r' 'l' 'd' '\0' Jak przetłumaczyć x[3]??? tab[3] - weź adres tablicy tab dodaj do niego 3 i pobierz znak, p[3] - weź adres wskaźnika p, pobierz jego wartość, dodaj do niej 3 i pobierz znak. Gdzie znajduje się x[3]??? tab[3] - znak odległy o 3 miejsca od początku obiektu o nazwie tab, p[3] - znak odległy o 3 miejsca od obiektu wskazywanego przez p. (Wykład 2) Wskaźniki 8 marca 2019 9 / 17

Przekazywanie tablic do funkcji W języku C nie można (i nie trzeba) przekazać do funkcji całej tablicy. (Wykład 2) Wskaźniki 8 marca 2019 10 / 17

Przekazywanie tablic do funkcji W języku C nie można (i nie trzeba) przekazać do funkcji całej tablicy. Do funkcji można przekazać tylko i wyłącznie adres do pierwszego elementu tablicy, podając nazwę tablicy bez indeksu. (Wykład 2) Wskaźniki 8 marca 2019 10 / 17

Przekazywanie tablic do funkcji W języku C nie można (i nie trzeba) przekazać do funkcji całej tablicy. Do funkcji można przekazać tylko i wyłącznie adres do pierwszego elementu tablicy, podając nazwę tablicy bez indeksu. Przykład: int main ( void ){ int tab [10]; func ( tab ); return 0; } (Wykład 2) Wskaźniki 8 marca 2019 10 / 17

Przekazywanie tablic do funkcji W języku C nie można (i nie trzeba) przekazać do funkcji całej tablicy. Do funkcji można przekazać tylko i wyłącznie adres do pierwszego elementu tablicy, podając nazwę tablicy bez indeksu. Przykład: int main ( void ){ int tab [10]; func ( tab ); return 0; } 3 sposoby deklaracji funkcji func(): void func ( int *x); void func ( int x [10]) ; void func ( int x []) ; (Wykład 2) Wskaźniki 8 marca 2019 10 / 17

Przekazywanie tablic do funkcji W języku C nie można (i nie trzeba) przekazać do funkcji całej tablicy. Do funkcji można przekazać tylko i wyłącznie adres do pierwszego elementu tablicy, podając nazwę tablicy bez indeksu. Przykład: int main ( void ){ int tab [10]; func ( tab ); return 0; } 3 sposoby deklaracji funkcji func(): void func ( int *x); void func ( int x [10]) ; void func ( int x []) ; Wewnątrz funkcji func() wyrażenie sizeof x zwraca rozmiar wskaźnika, a nie tablicy. (Wykład 2) Wskaźniki 8 marca 2019 10 / 17

Przekazywanie tablic do funkcji W języku C nie można (i nie trzeba) przekazać do funkcji całej tablicy. Do funkcji można przekazać tylko i wyłącznie adres do pierwszego elementu tablicy, podając nazwę tablicy bez indeksu. Przykład: int main ( void ){ int tab [10]; func ( tab ); return 0; } Wewnątrz funkcji func() wyrażenie sizeof x zwraca rozmiar wskaźnika, a nie tablicy. Rozmiar tablicy musimy przekazać jawnie: void func ( int *x, int roz ); void func ( int x [10], int roz ); void func ( int x[], int roz ); (Wykład 2) Wskaźniki 8 marca 2019 11 / 17

Modyfikatory dostępu dla tablic (C99) Standard C99 pozwala na użycie słowa kluczowego static wewnątrz nawiasów w deklaracji tablicy, jeśli występuje jako parametr funkcji. (Wykład 2) Wskaźniki 8 marca 2019 12 / 17

Modyfikatory dostępu dla tablic (C99) Standard C99 pozwala na użycie słowa kluczowego static wewnątrz nawiasów w deklaracji tablicy, jeśli występuje jako parametr funkcji. Przykład: int fun ( char str [ static 80]) {... } Słowo kluczowe static informuje kompilator, że tablica wskazywana przez parametr str będzie zawierała co najmniej określoną (80) liczbę elementów. (Wykład 2) Wskaźniki 8 marca 2019 12 / 17

Przekazywanie tablic do funkcji - przykład # define SIZE 10 int sump ( int * start, int * end ) { int total = 0; while ( start < end ) total += * start ++; } return total ; (Wykład 2) Wskaźniki 8 marca 2019 13 / 17

Przekazywanie tablic do funkcji - przykład # define SIZE 10 int sump ( int * start, int * end ) { int total = 0; while ( start < end ) total += * start ++; } return total ; int tab [ SIZE ] = {20,10,5,39,4,16,19,26,31,20}; int sum = sump ( tab, tab + SIZE ); (Wykład 2) Wskaźniki 8 marca 2019 13 / 17

Dynamiczna alokacja pamięci - stdlib.h Dynamiczna alokacja pamięci to sposób, w jaki działający program uzyskuje dodatkową pamięć, której ilości nie można określić przed jego uruchomieniem. (Wykład 2) Wskaźniki 8 marca 2019 14 / 17

Dynamiczna alokacja pamięci - stdlib.h Dynamiczna alokacja pamięci to sposób, w jaki działający program uzyskuje dodatkową pamięć, której ilości nie można określić przed jego uruchomieniem. Dynamiczna alokacja pamięci umożliwia tworzenie dynamicznych(abstrakcyjnych) struktur danych. (Wykład 2) Wskaźniki 8 marca 2019 14 / 17

Dynamiczna alokacja pamięci - stdlib.h Dynamiczna alokacja pamięci to sposób, w jaki działający program uzyskuje dodatkową pamięć, której ilości nie można określić przed jego uruchomieniem. Dynamiczna alokacja pamięci umożliwia tworzenie dynamicznych(abstrakcyjnych) struktur danych. Funkcje dynamicznej alokacji pamięci przydzielają pamięć ze sterty. (Wykład 2) Wskaźniki 8 marca 2019 14 / 17

Dynamiczna alokacja pamięci - stdlib.h Dynamiczna alokacja pamięci to sposób, w jaki działający program uzyskuje dodatkową pamięć, której ilości nie można określić przed jego uruchomieniem. Dynamiczna alokacja pamięci umożliwia tworzenie dynamicznych(abstrakcyjnych) struktur danych. Funkcje dynamicznej alokacji pamięci przydzielają pamięć ze sterty. Rozmiar sterty z reguły jest dość duży, jednak ograniczony i pamięć ze sterty może się wyczerpać. (Wykład 2) Wskaźniki 8 marca 2019 14 / 17

Dynamiczna alokacja pamięci - stdlib.h void *malloc(size t size); - przydziela blok pamięci o rozmiarze size, nie inicjalizując go. Funkcja zwraca adres bloku, a w przypadku niepowodzenia NULL. (Wykład 2) Wskaźniki 8 marca 2019 15 / 17

Dynamiczna alokacja pamięci - stdlib.h void *malloc(size t size); - przydziela blok pamięci o rozmiarze size, nie inicjalizując go. Funkcja zwraca adres bloku, a w przypadku niepowodzenia NULL. void *calloc(size t n, size t size); - przydziela miejsce dla tablicy n elementów każdy o rozmiarze size, wszystkie bity w rezerwowanym obszarze otrzymują wartość 0. Funkcja zwraca adres bloku, a w przypadku niepowodzenia NULL. (Wykład 2) Wskaźniki 8 marca 2019 15 / 17

Dynamiczna alokacja pamięci - stdlib.h void *malloc(size t size); - przydziela blok pamięci o rozmiarze size, nie inicjalizując go. Funkcja zwraca adres bloku, a w przypadku niepowodzenia NULL. void *calloc(size t n, size t size); - przydziela miejsce dla tablicy n elementów każdy o rozmiarze size, wszystkie bity w rezerwowanym obszarze otrzymują wartość 0. Funkcja zwraca adres bloku, a w przypadku niepowodzenia NULL. void free(void *ptr); - zwalnia obszar pamięci wskazywany przez ptr, ptr - powinien być wartością zwróconą wcześniej przez malloc(), calloc() lub realloc(). (Wykład 2) Wskaźniki 8 marca 2019 15 / 17

Dynamiczna alokacja pamięci - stdlib.h void *malloc(size t size); - przydziela blok pamięci o rozmiarze size, nie inicjalizując go. Funkcja zwraca adres bloku, a w przypadku niepowodzenia NULL. void *calloc(size t n, size t size); - przydziela miejsce dla tablicy n elementów każdy o rozmiarze size, wszystkie bity w rezerwowanym obszarze otrzymują wartość 0. Funkcja zwraca adres bloku, a w przypadku niepowodzenia NULL. void free(void *ptr); - zwalnia obszar pamięci wskazywany przez ptr, ptr - powinien być wartością zwróconą wcześniej przez malloc(), calloc() lub realloc(). free(null) nie powoduje żadnej akcji, nie trzeba sprawdzać czy adres jest różny od NULL przed wywołaniem free. (Wykład 2) Wskaźniki 8 marca 2019 15 / 17

stdlib.h - malloc int *p = malloc (50 * sizeof ( int )); if (!p){ printf (" Brak pamieci \n"); // wyjscie awaryjne // return ; lub return x; // lub exit ( -1); }... free (p); (Wykład 2) Wskaźniki 8 marca 2019 16 / 17

stdlib.h - malloc int *p = malloc (50 * sizeof ( int )); if (!p){ printf (" Brak pamieci \n"); // wyjscie awaryjne // return ; lub return x; // lub exit ( -1); }... free (p); W języku C nie rzutujemy adresu zwracanego przez malloc(). (Wykład 2) Wskaźniki 8 marca 2019 16 / 17

stdlib.h - malloc int *p = malloc (50 * sizeof ( int )); if (!p){ printf (" Brak pamieci \n"); // wyjscie awaryjne // return ; lub return x; // lub exit ( -1); }... free (p); W języku C nie rzutujemy adresu zwracanego przez malloc(). Rzutowanie konieczne było w latach 70 i 80 kiedy malloc() zwracał char*. (Wykład 2) Wskaźniki 8 marca 2019 16 / 17

stdlib.h - malloc int *p = malloc (50 * sizeof ( int )); if (!p){ printf (" Brak pamieci \n"); // wyjscie awaryjne // return ; lub return x; // lub exit ( -1); }... free (p); W języku C nie rzutujemy adresu zwracanego przez malloc(). Rzutowanie konieczne było w latach 70 i 80 kiedy malloc() zwracał char*. Dla dowolnego typu: typ *p = malloc (n * sizeof ( typ )); (Wykład 2) Wskaźniki 8 marca 2019 16 / 17

stdlib.h - realloc void *realloc(void *ptr, size t size); - zmienia rozmiar bloku pamięci wskazywanego przez ptr na size. (Wykład 2) Wskaźniki 8 marca 2019 17 / 17

stdlib.h - realloc void *realloc(void *ptr, size t size); - zmienia rozmiar bloku pamięci wskazywanego przez ptr na size. Dotychczasowa zawartość bloku pamięci pozostaje niezmieniona, ale może zostać skrócona, jeśli nowy rozmiar jest mniejszy niż poprzedni. (Wykład 2) Wskaźniki 8 marca 2019 17 / 17

stdlib.h - realloc void *realloc(void *ptr, size t size); - zmienia rozmiar bloku pamięci wskazywanego przez ptr na size. Dotychczasowa zawartość bloku pamięci pozostaje niezmieniona, ale może zostać skrócona, jeśli nowy rozmiar jest mniejszy niż poprzedni. Jeżeli przydzielenie miejsca było niemożliwe, to funkcja zwraca NULL i pozostawia pierwotny blok bez zmian. (Wykład 2) Wskaźniki 8 marca 2019 17 / 17

stdlib.h - realloc void *realloc(void *ptr, size t size); - zmienia rozmiar bloku pamięci wskazywanego przez ptr na size. Dotychczasowa zawartość bloku pamięci pozostaje niezmieniona, ale może zostać skrócona, jeśli nowy rozmiar jest mniejszy niż poprzedni. Jeżeli przydzielenie miejsca było niemożliwe, to funkcja zwraca NULL i pozostawia pierwotny blok bez zmian. Przykład. int * tab = malloc ( SIZE * sizeof ( int ));... tab = realloc (tab,( SIZE -A)* sizeof ( int ));... tab = realloc (tab,( SIZE +A)* sizeof ( int ));... free ( tab ); (Wykład 2) Wskaźniki 8 marca 2019 17 / 17

stdlib.h - realloc void *realloc(void *ptr, size t size); - zmienia rozmiar bloku pamięci wskazywanego przez ptr na size. Dotychczasowa zawartość bloku pamięci pozostaje niezmieniona, ale może zostać skrócona, jeśli nowy rozmiar jest mniejszy niż poprzedni. Jeżeli przydzielenie miejsca było niemożliwe, to funkcja zwraca NULL i pozostawia pierwotny blok bez zmian. Przykład. int * tab = malloc ( SIZE * sizeof ( int ));... tab = realloc (tab,( SIZE -A)* sizeof ( int ));... tab = realloc (tab,( SIZE +A)* sizeof ( int ));... free ( tab ); realloc(null, size) jest równoważne malloc(size). (Wykład 2) Wskaźniki 8 marca 2019 17 / 17

stdlib.h - realloc void *realloc(void *ptr, size t size); - zmienia rozmiar bloku pamięci wskazywanego przez ptr na size. Dotychczasowa zawartość bloku pamięci pozostaje niezmieniona, ale może zostać skrócona, jeśli nowy rozmiar jest mniejszy niż poprzedni. Jeżeli przydzielenie miejsca było niemożliwe, to funkcja zwraca NULL i pozostawia pierwotny blok bez zmian. Przykład. int * tab = malloc ( SIZE * sizeof ( int ));... tab = realloc (tab,( SIZE -A)* sizeof ( int ));... tab = realloc (tab,( SIZE +A)* sizeof ( int ));... free ( tab ); realloc(null, size) jest równoważne malloc(size). realloc(ptr, 0) jest równoważne free(ptr). (Wykład 2) Wskaźniki 8 marca 2019 17 / 17