38993

38993



116


ROZDZIAŁ 17. WSKAŹNIKI

Wskaźniki można również od siebie odejmować, czego wynikiem jest odległość dwóch wskazywanych wartości. Odległość zwracana jest jako liczba obiektów danego typu. a nie liczba bajtów. Np.:

int a[] - <1, 2, 3, 5, 7>; int *ptr ■ &a[2];

int diff ■ ptr - a; /* diff ma wartość 2 (a nie 2*sizeof(int)) */

Wynikiem może być oczywiście liczba ujemna. Operacja jest przydatna do obliczania wielkości tablicy (długości łańcucha znaków) jeżeli mamy wskaźnik na jej pierwszy i ostatni element.

Operacje arytmetyczne na wskaźnikach mają pewne ograniczenia. Przede wszystkim nie można (tzn. standard tego nie definiuje) skonstruować wskaźnika wskazującego gdzieś poza zadeklarowaną tablicę, chyba, że jest to obiekt zaraz za ostatnim (one past last), np.:

int a[] - {1, 2, 3, 5, 7>; int *ptr;

ptr - a + 10; /* niezdefiniowane •/ ptr «a - 10; /* niezdefiniowane •/ ptr = a + 5;    /* zdefiniowanie (element za ostatnim) */

•ptr ■ 10;    /• to już nie! •/

Nie można'1 również odejmować od siebie wskaźników wskazujących na obiekty znajdujące się w różnych tablicach, np.:

int a[] = {1, 2, 3>, b[) - {5, 7>;

int *ptrl - a, *ptr2 - b;

int diff * a - b; /* niezdefiniowane •/

Tablice a wskaźniki

Trzeba wiedzieć, że tablice to też rodzaj zmiennej wskaźnikowej. Taki wskaźnik wskazuje na miejsce w pamięci, gdzie przechowywany jest jej pierwszy element . Następne elementy znajdują się bezpośrednio w następnych komórkach pamięci, w odstępie zgodnym z wielkością odpowiedniego typu zmiennej.

Na przykład tablica:

int tab[] - {100,200,300};

występuje w pamięci w sześciu komórkach 1 2:

+-------—f--------+---------4--------+-------+--------+

I wartościI    |wartosc2l    lwartosc3l    I

+--------+--------+--------+--------+--------+--------+

I00000000101100100100000000I11001000I00000001100101100I

1

To znaczy standard nie definiuje co się wtedy stanie, aczkolwiek na większości architektur odejmowanie dowolnych dwóch wskaźników ma zdefiniowane zachowanie. Pisząc przenośne programy nic można jednak na tym polegać, zwłaszcza, że odejmowanie wskaźników wskazujących na elementy różnych tablic zazwyczaj nie ma sensu.

2

^Ponownie przyjmując, że bajt ma 8 bitów, int dwa bajty i liczby zapisywane są w formacie little endian



Wyszukiwarka

Podobne podstrony:
126 ROZDZIAŁ 17. WSKAŹNIKI I struct urządzenie moje_urzadzeuie; moje_uxzadzenie.nl =
114 ROZDZIAŁ 17. WSKAŹNIKI +--------► IkomórkalI +--------+ llllllllll * (unsigned char)
118 ROZDZIAŁ 17. WSKAŹNIKI Zwróćmy uwagę na wywołanie func(kz);. Należy pamiętać, by do funkcji
120 ROZDZIAŁ 17. WSKAŹNIKI Wskaźniki na stalą wartość są przydatne między innymi w sytuacji gdy mamy
122 ROZDZIAŁ 17. WSKAŹNIKI Ostatnią funkcją jest funkcja ca!loc(). Przyjmuje ona dwa argumenty: licz
124 ROZDZIAŁ 17. WSKAŹNIKI określone miejsce w pamięci. A ponieważ funkcja ma swój adres®, to nie ma
126 ROZDZIAŁ 17. WSKAŹNIKI { struct urządzenie moje.urządzeńle; moje.urzadzenie.m -
graniczne (NDS i NDN), ryzyko można ocenić od razu jako małe (M) - wyniki pomiarów poniżej 0,5 NDN i
„Negocjacje są podstawowym sposobem uzyskania od innych tego, czego chcemy. Jest to zwrotny spo
NEGOCJACJE „Negocjacje są podstawowym sposobem uzyskania od innych tego, czego chcemy. Jest to
53493 ullman117 (2) 4 DZIAŁANIA W MODELU RELACYJNYM A teraz można wprowadzić spójnik NOT do porównan
DSCN6868 (2) znacznie się od siebie różnią!^ Często kompozycja jest taka, ; źe „wskazuje” oś
sa6 (2) KSIĘGA PIERWSZA, ROZDZIAŁ 1 15 umieścił na środku żywe odbicie siebie samego: CZŁOWIEKA. To
CCF20100308006 Czas efektywny można również obliczyć za pomocą iloczynu czasu nominalnego i wskaźni
3 6 (4) 3 -6 WSKAŹNIKI I URZĄDZENIA KONTROLNE DESKA ROZDZIELCZA 3    4 17 16 15

więcej podobnych podstron