ANSI C 4

ANSI C 4




WSKAŹNIKI I TABLICE

Wskaźnik jest zmienną, która zawiera adres innej zmiennej. W języku C chętnie ko rzysta się ze wskaźników częściowo dlatego, że czasami jest to jedyny sposób przedstawienia algorytmu obliczenia, częściowo zaś dlatego, że ich użycie zwykle prowadzi do bardziej zwartego i efektywnego kodu niż otrzymywany innymi sposobami Wskaźniki i tablice są blisko spokrewnione; w tym rozdziale badamy to pokrewieństwo i pokazujemy, jak można z niego korzystać.

Wskaźniki wraz z instrukcją goto „cudownie” nadają się do tworzenia zupełnie niezrozumiałych programów. Dzieje się tak bez wątpienia wówczas, gdy wskaźniki są stosowane nieostrożnie. Łatwo jest bowiem utworzyć wskaźnik, który wskazuje nie wiadomo na co. Jednak przy przestrzeganiu odpowiedniej dyscypliny dzięki wskaźnikom można osiągnąć znaczną przejrzystość i prostotę algorytmów. Właśnie ten aspekt spróbujemy zilustrować.

Główna zmiana w ANSI C polega na jawnym określeniu reguł, według których można manipulować wskaźnikami, a więc w efekcie jest uprawomocnieniem tego, co dobrzy programiści od dawna stosują, a czego dobre kompilatory od dawna przestrzegają. Dodatkowo zamiast typu char * (wskaźnik do typu char) wprowadzono typ void* (wskaźnik do typu void) jako jedyny poprawny typ dla wskaźnika ogólnego.


Wskaźniki i adresy

Rozpoczniemy od pokazania prościutkiego obrazka, na którym widać, jak jest zorgfr nizowana pamięć. W typowej maszynie jest to tablica kolejno numerowanych lub au resowanych komórek pamięci; można nimi manipulować indywidualnie lub posługiwać się całymi grupami sąsiednich komórek. Ogólny stan rzeczy jest taki, że dowoln; bajt można traktować jako obiekt typu char, parę jednobajtowych komórek - jak obiekt całkowity typu short, a cztery przylegające do siebie bajty - jako obiekt ca kowity typu long. Wskaźnik jest grupą komórek (często dwie lub cztery), które mo?' pomieścić adres. A więc jeśli c jest obiektem typu char, a p jest wskaźnikiem, któr wskazuje na c, to taką sytuację możemy zilustrować następująco:    r

5.1 WSKAŹNIKI I ADRESY


Jednoargumentowy operator & podaje adres obiektu, zatem instrukcja

p = &c;

przypisuje zmiennej p adres zmiennej c; teraz zmienna p „wskazuje na” zmienną c. Operator adresu & może być stosowany tylko do obiektów zajmujących pamięć: zmiennych i elementów tablic. Nie można go stosować do wyrażeń, stałych i zmiennych register.

Jednoargumentowy operator * oznacza adresowanie pośrednie lub odwołanie pośrednie; zastosowany do wskaźnika daje zawartość obiektu wskazywanego przez ten wskaźnik. Przypuśćmy, że x i y są obiektami całkowitymi, a ip jest wskaźnikiem do obiektu typu int. Następujący sztuczny ciąg instrukcji pokazuje, jak zadeklarować wskaźnik oraz jak stosować operatory & i *:

int x = 1, y = 2, z[10];

int *ip; /* ip jest wskaźnikiem do obiektów typu int */

ip = &x;

y = *ip;

*ip = 0; ip = &z[0];


/* teraz ip wskazuje na x */

/* y ma teraz wartość 1 */

/* x ma teraz wartość 0 */

/* teraz ip wskazuje na element z[0] */

Deklaracje obiektów X, y i z znamy już od dawna. Deklaracja wskaźnika ip: int *ip;

z założenia jest mnemotechniczna; mówi ona, że wyrażenie *ip ma wartość typu int. Składnia deklaracji tej zmiennej naśladuje składnię wyrażenia, w którym zmienna może wystąpić. Takie rozumowanie stosuje się również do deklaracji funkcji. Na przykład deklaracja

double *dp, atof(char *);

mówi, że w wyrażeniu obie konstrukcje *dp i atof(s) mają wartości typu double oraz że argument funkcji atof jest wskaźnikiem do typu char.

Zapamiętaj także płynący stąd wniosek: od wskaźnika wymaga się wskazywania obiektów określonego rodzaju. (Z jednym wyjątkiem - wskaźnik do void, czyli „wskaźnik do niczego”, może przechowywać wskaźnik do obiektów dowolnego typu, ale nie można go stosować do adresowania pośredniego. Wrócimy do tego w p. 5.11.)

131


Wyszukiwarka

Podobne podstrony:
ANSI C 4 5 WSKAŹNIKI I TABLICE #define MAXLEN 1000 /* maks. długość wiersza wejściowego */ int get
ANSI C 4 5 WSKAŹNIKI I TABLICE int gettoken (void); int tokentype; char token[MAXTOKEN]; 
Poznaj C++ w$ godziny0139 128 Godzina 9 Stop. Przeczytaj tę definicję jeszcze raz. Wskaźnik jest zmi
ANSI C 4 6 STRUKTURY Funkcja addtree jest rekurencyjna. Funkcja main wprowadza wczytane słowo na n
ANSI C 5 5 WSKAŹNIKI I TABLICE Jeżeli wskaźnik ip wskazuje na zmienną całkowitą x, to *ip może wys
ANSI C 8 5 WSKAŹNIKI I TABLICE Między nazwą tablicy a wskaźnikiem jest jednak istotna różnica, o k
ANSI C 9 5 WSKAŹNIKI I TABLICE______—-- alloc i afree jest stosem lub listą LIFO (ang. last-in, fi
ANSI C 0 5 WSKAŹNIKI I TABLICE o specjalną wartość wskaźnikową. Stała NULL jest zdefiniowana w
cz4 Programowanie Nazwa wskaźnika. Jest to nazwo tworzonej zmiennej. Nic ma nic wspólEego z nazwą f
CCF20081016056 Zmienna Wskaźniki Dla jednych zmiennych wyszukiwanie wskaźników jest łatwiejsze, dli
DSC00762 Tablice wskaźników Tablica wskaźników jest to ciąg adresów, zajmujący ciągły obszar w pamię
ANSI C 4 4 FUNKCJE I STRUKTURA PROGRAMU Funkcja main jest pętlą zawierającą ogromną instrukcję swi
ANSI C 6 5 WSKAŹNIKI I TABLICE _ Obrazowo wygląda to tak: 5 2 WSKAŹNIKI I ARGUMENTY FUNKCJI w miej
ANSI C 7 5 WSKAŹNIKI I TABLICE Ćwiczenie 5.1. Tak jak została napisana, funkcja getint traktuje zn
ANSI C 1 5 WSKAŹNIKI I TABLICE Stałe napisowe chyba najczęściej występują jako argumenty funkcji,
ANSI C 2 5 WSKAŹNIKI I TABLICE _______^ operator przyrostkowy ++ nie zmieni t, dopóki nie zostanie
ANSI C 3 5 WSKAŹNIKI I TABLICE możliwości są zawarte w funkcjach: getline (rozdz. 1 i 4), atoi, it
ANSI C 5 5 WSKAŹNIKI I TABLICE /* swap: zamień miejscami v[i] i v[j] */ void swap(char *v[], int i
ANSI C 6 5 WSKAŹNIKI I TABLICE_______—- Oprócz tej różnicy w zapisie tablicę dwuwymiarową traktuj

więcej podobnych podstron