7020
Szczegóły |
Tytuł |
7020 |
Rozszerzenie: |
PDF |
Jesteś autorem/wydawcą tego dokumentu/książki i zauważyłeś że ktoś wgrał ją bez Twojej zgody? Nie życzysz sobie, aby podgląd był dostępny w naszym serwisie? Napisz na adres
[email protected] a my odpowiemy na skargę i usuniemy zabroniony dokument w ciągu 24 godzin.
7020 PDF - Pobierz:
Pobierz PDF
Zobacz podgląd pliku o nazwie 7020 PDF poniżej lub pobierz go na swoje urządzenie za darmo bez rejestracji. Możesz również pozostać na naszej stronie i czytać dokument online bez limitów.
7020 - podejrzyj 20 pierwszych stron:
prof. Jan Bielecki
Visual C++ 6.0
Podstawy programowania
Dodatki
Priorytety operator�w
Opracowywanie wyra�e�
Konwersje standardowe
Funkcje wej�cia-wyj�cia
Pierwsze kroki
Program jest zbiorem modu��w �r�d�owych. Ka�dy modu� sk�ada si� z deklaracji typ�w, zmiennych i funkcji. Napis od znak�w // do ko�ca wiersza jest komentarzem. Jako taki nie ma wp�ywu na przebieg wykonania programu.
Dok�adnie jeden modu�, nazywany g��wnym, zawiera deklaracj� funkcji main. Wykonanie programu polega na opracowaniu wszystkich jego globalnych deklaracji, a nast�pnie przyst�pieniu do wykonywania instrukcji zawartych w funkcji main. Zako�czenie wykonywania programu nast�puje po wykonaniu w funkcji g��wnej instrukcji return, albo tu� po powrocie z funkcji exit. Mo�e to nast�pi� jeszcze przed podj�ciem wykonywania funkcji g��wnej.
int main(void) // deklaracja funkcji g��wnej
{
return 0; // instrukcja return
}
void exit(int); // deklaracja funkcji exit
struct Empty { // deklaracja typu Empty
Empty(void)
{
exit(0); // wywo�anie funkcji exit
}
};
Empty obj; // deklaracja zmiennej
Program napisano w taki spos�b, aby jego wykonanie zako�czy�o si� przed podj�ciem wykonywania funkcji g��wnej.
Komunikacja z otoczeniem
W najprostszym przypadku, program pobiera dane z klawiatury i wyprowadza je na monitor. Operacje wprowadzania danych odbywaj� si� za pomoc� operatora >>, a operacje wyprowadzania danych za pomoc� operatora <<. Klawiatura jest reprezentowana przez zmienn� cin, a monitor przez zmienn� cout. Pos�u�enie si� nimi wymaga u�ycia dyrektywy #include wyszczeg�lniaj�cej nazw� iostream.h.
Dan� wprowadzon� z klawiatury ko�czy odst�p, uzyskany przez naci�ni�cie klawisza Space, Tab albo Enter. Analiza danych wej�ciowych nast�puje wierszami, to jest dopiero po naci�ni�ciu klawisza Enter. W szczeg�lno�ci, je�li program oczekuje 3 danych, to ka�d� mo�na poda� w osobnym wierszu, albo wszystkie poda� w jednym wierszu. Przed wprowadzeniem kolejnej danej pomija si� poprzedzaj�ce j� odst�py.
Uwaga: Wygodnym sposobem wyprowadzenia odst�pu Enter jest u�ycie symbolu endl.
Poniewa� operacja wej�cia-wyj�cia dostarcza w miejscu jej u�ycia jej lewy argument, wi�c zapis pary instrukcji
cin >> one;
cin >> two;
mo�na upro�ci� do
cin >> one >> two;
W�a�ciwo�� t�, nazywan� ��czeniem operacji, mo�na zastosowa� tak�e do wyprowadzania danych.
#include <iostream.h>
int main(void)
{
int one, two;
cout << "Enter 2 numbers:" << endl;
cin >> one >> two;
cout << "Sum = " << one + two << endl;
return 0;
}
Program wyprowadza zach�t� do wprowadzenia 2 liczb, a nast�pnie wyznacza i wyprowadza ich sum�.
Wykonywanie operacji
Wykonanie programu sprowadza si� do wykonania operacji na danych. W Dodatku A zamieszczono kompletny wykaz operacji, a w Dodatku B om�wiono zasady opracowywania wyra�e�. Bieg�e programowanie w C++ wymaga starannego zapoznania si� z podanymi tam opisami.
Operacje przypisania
Prosta operacja przypisania ma posta�
a = b
w kt�rej a i b s� wyra�eniami, ale ponadto a jest l-nazw� zmiennej (por. Dodatek B).
Wykonanie operacji polega na przypisaniu zmiennej a warto�ci wyra�enia b.
Z�o�ona operacja przypisania ma posta�
a @= b
w kt�rej @= jest jednym z operator�w wymienionych w Dodatku A (np. +=, -=, *= , /=).
Operacj� a�@=�b (np. a�+=�b) wykonuje tak, jak operacj�
a = a + b
ale wymaga si�, aby opracowanie a i b by�o jednokrotne.
Operacja po��czenia
Operacja po��czenia ma posta�
a , b
Jej wykonanie sk�ada si� z opracowania wyra�enia a (wy��cznie dla jego skutk�w ubocznych) oraz z niejawnego zast�pienia ca�ej operacji nazw� zmiennej reprezentowanej przez wyra�enie b.
Uwaga: Nie jest operatorem po��czenia przecinek oddzielaj�cy parametry i argumenty funkcji.
W szczeg�lno�ci wykonanie instrukcji
return a = 10, cout << a, b = 20;
jest r�wnowa�ne wykonaniu instrukcji
a = 10;
cout << a;
b = 20;
return b;
Operacje arytmetyczne
Operacje arytmetyczne wykonuje si� za pomoc� operator�w wymienionych w tabeli Operacje arytmetyczne.
Tabela Operacje arytmetyczne
###
+ (dodawanie) - (odejmowanie)
* (mno�enie) / (dzielenie) % (reszta)
++ (zwi�kszenie o 1) -- (zmniejszenie o 1)
+= (dodanie) -= (odj�cie)
*= (pomno�enie) /= (podzielenie)
###
Spos�b wykonania podstawowych dzia�a� arytmetycznych nie wymaga opisu. Nale�y jedynie zauwa�y�, �e rezultat dzielenia ca�kowitego jest ca�kowity, a argumenty wyznaczania reszty musz� by� ca�kowite (np. 11 / 4 ma warto�� 2, a 11 % 4 ma warto�� 3).
Operacje przedrostkowe
Wykonanie operacji ++num powoduje zwi�kszenie warto�ci zmiennej num o 1. W miejsce wykonania operacji jest dostarczana nowa warto�� num.
Wykonanie operacji --num powoduje zmniejszenie warto�ci zmiennej num o 1. W miejsce wykonania operacji jest dostarczana nowa warto�� num.
int fix = 10;
cout << ++fix; // 11
cout << fix; // 11
Operacje przyrostkowe
Wykonanie operacji num++ powoduje zwi�kszenie warto�ci zmiennej num o 1. W miejsce wykonania operacji jest dostarczana pierwotna warto�� num.
Wykonanie operacji num-- powoduje zmniejszenie warto�ci zmiennej num o 1 W miejsce wykonania operacji jest dostarczana pierwotn� warto�� num.
int fix = 10;
cout << fix--; // 10
cout << fix; // 9
Operacje por�wnania
Operacje por�wnania wykonuje si� za pomoc� operator�w wymienionych w tabeli Operacje por�wnania.
Tabela Operacje por�wnania
###
== (r�wne) != (nie r�wne),
< (mniejsze) > (wi�ksze),
<= (mniejsze lub r�wne) >= (wi�ksze lub r�wne)
###
Je�li por�wnanie wyra�a orzeczenie prawdziwe, to jego rezultat ma warto�� true (prawda). W przeciwnym razie ma warto�� false (fa�sz).
Uwaga: Por�wnanie na r�wno�� wykonuje si� za pomoc� operacji ==, a nie za pomoc� operacji =. Zaniedbanie tego faktu jest �r�d�em trudnych do wykrycia b��d�w semantycznych.
#include <iostream.h>
int main(void)
{
int num = 0;
while(num == 0)
cin >> num;
cout << num << endl;
return 0;
}
Program wyprowadza liczb� 0 albo pierwsz� niezerow� liczb� wprowadzon� z klawiatury. Gdyby operator por�wnania zast�piono operatorem przypisania, to zawsze wyprowadza�by liczb� 0.
Operacje orzecznikowe
Operacje orzecznikowe wykonuje si� za pomoc� operator�w wymienionych w tabeli Operacje orzecznikowe.
Tabela Operacje orzecznikowe
###
! (zaprzeczenie) && (koniunkcja) || (dysjunkcja)
###
Argumenty i rezultaty operacji orzecznikowych s� typu bool i maj� warto�ci true albo false.
Rezultat zaprzeczenia ma warto�� true tylko w�wczas, gdy argument ma warto�� false.
Rezultat koniunkcji ma warto�� true tylko w�wczas, gdy oba argumenty maj� warto�� true.
Rezultat dysjunkcji ma warto�� false tylko w�wczas, gdy oba argumenty maj� warto�� false.
Uwaga: Operacja koniunkcji i dysjunkcji jest wykonywana w taki spos�b, �e je�li po opracowaniu pierwszego argumentu jest znana warto�� rezultatu ca�ej operacji (bo dla koniunkcji ma warto�� false, a dla dysjunkcji ma warto�� true), to rezygnuje si� z opracowania drugiego argumentu.
#include <iostream.h>
int vec[] = { 10, 20, 30, 40, 50 };
int main(void)
{
int pos;
cin >> pos;
pos >= 0 && pos < 5 && (cout << vec[pos]);
return 0;
}
Program wyprowadza warto�� tego elementu tablicy, kt�rego indeks wprowadzono z klawiatury.
Je�li wprowadzi si� indeks, kt�ry nie ma warto�ci z przedzia�u [0 ; 4], to program nie wyprowadzi nic.
Dzi�ki u�yciu operatora &&, nigdy nie dojdzie do opracowania wyra�enia vec[pos] z niedozwolonym indeksem.
Operacje konwersji
Wykonanie konwersji ma na celu przekszta�cenie zmiennej pewnego typu w zmienn� typu docelowego.
Operacja konwersji wyra�enia e do typu Type ma posta�
(Type)e
Je�li nazw� typu docelowego Type mo�na wyrazi� za pomoc� identyfikatora (np.�int), to operacj� konwersji mo�na zapisa� jako
Type(e)
W szczeg�lno�ci, je�li w programie wyst�puje instrukcja
int num = 4.8;
w kt�rej zmienna num jest typu int, a wyra�enie 4.8 jest typu double, to poniewa� danej typu double (zazwyczaj 8-bajtowej) nie mo�na pomie�ci� w zmiennej typu int (zazwyczaj 4-bajtowej), wi�c najpro�ciej by�oby tak� instrukcje uzna� za b��dn�.
Poniewa� w C++ przekszta�cenie zmiennej typu double w zmienn� typu int zdefiniowano jako konwersj� standardow� (polega ona na odrzuceniu cz�ci u�amkowej), wi�c rozpatrywana instrukcja zostanie niejawnie zmieniona w poprawn� instrukcj�
int num = int(4.8);
r�wnowa�n�
int num = 4;
w kt�rej wyra�enie inicjuj�ce jest ju� typu int.
Uwaga: Wa�ne informacje na temat konwersji zamieszczono w Dodatku C.
Wykonywanie instrukcji
Do napisania dowolnego programu wystarczy zaledwie kilka instrukcji. Najwa�niejszymi z nich s�: instrukcja pusta, grupuj�ca, warunkowa (if), iteracyjna (while) i powrotu (return). Opis pozosta�ych ograniczono do przyk�ad�w.
Instrukcja pusta
Instrukcja pusta sk�ada si� ze �rednika.
;
Jej wykonanie nie ma �adnych skutk�w.
Instrukcja grupuj�ca
Instrukcja grupuj�ca sk�ada si� z nawias�w klamrowych zawieraj�cych dowoln� sekwencj� instrukcji.
Je�li w miejscu, w kt�rym sk�adnia wymaga u�ycia dok�adnie jednej instrukcji, chce si� umie�ci� ich wi�cej, to wystarczy uj�� je w nawiasy klamrowe i powstanie jedna instrukcja.
{ int a; cin >> a; a++; cout << a; }
Instrukcja warunkowa
Instrukcja warunkowa ma posta�
if(c)
s
albo
if(c)
s1
else
s2
w kt�rej c jest wyra�eniem orzecznikowym o warto�ci true albo false, a s1 oraz s2 jest pojedyncz� instrukcj� (np. instrukcj� grupuj�c�).
Wykonanie instrukcji warunkowej zaczyna si� od opracowania wyra�enia c (np.�a�>�2). Je�li wyra�one przez nie orzeczenie jest prawdziwe, to w pierwszym przypadku jest wykonywana instrukcja s, a w drugim instrukcja s1. W przeciwnym razie, w pierwszym przypadku nie robi si� nic, a w drugim wykonuje instrukcj� s2.
if(a > 2)
{ a++; cout << a; }
else
{ cout << a; a-- }
albo r�wnowa�nie
if(a > 2) {
a++;
cout << a;
} else {
cout << a;
a--;
}
Instrukcja iteracyjna
Instrukcja iteracyjna ma posta�
while(c)
s
w kt�rej c jest wyra�eniem orzecznikowym, a s jest pojedyncz� instrukcj�.
Wykonanie instrukcji iteracyjnej polega na cyklicznym badaniu orzeczenia wyra�onego przez wyra�enie c i wykonywaniu instrukcji s.
Iteracja ko�czy si� w chwili stwierdzenia, �e orzeczenie jest nieprawdziwe. Je�li oka�e si� to ju� na wst�pie, to instrukcja s nie b�dzie wykonana wcale.
int i = 3;
while(i > 0) {
int t = i * i;
cout << t << endl; // 9 4 1
i--;
}
Nale�y zauwa�y�, �e instrukcj� iteracyjn� o postaci
d
while(c) {
s s ... s
e;
}
w kt�rej d jest instrukcj� deklaracyjn�, a e jest wyra�eniem, mo�na przedstawi� w postaci
for(d c ; e) {
s s ... s
}
Taka odmiana instrukcji iteracyjnej dobrze nadaje si� do opisania czynno�ci o znanej liczbie powt�rze�.
int tab[5] = { 10, 20, 30, 40, 50 }, sum = 0;
for(int i = 0; i < 5 ; i++)
sum += tab[i];
cout << "Sum = " << sum << endl;
Instrukcja zaniechania
Instrukcja zaniechania ma posta�
break;
Wykonanie instrukcji zaniechania powoduje zako�czenie wykonywania najw�szej obejmuj�cej j� instrukcji iteracyjnej albo decyzyjnej.
int sum = 0;
while(true) {
int tmp = 0;
cin >> tmp; // wprowad� dan�
if(tmp == 0) // zbadaj czy 0
break; // zako�cz iteracj�
sum += tmp; // dosumuj
}
cout << "Sum = " << sum << endl;
albo
int tmp = 0, sum = 0;
while(cin >> tmp, tmp) // wprowad� i zbadaj
sum += tmp; // dosumuj
cout << "Sum = " << sum << endl;
lub
for(int tmp = 0, sum = 0; cin >> tmp, tmp ; sum += tmp);
cout << "Sum = " << sum << endl;
Instrukcja powrotu
Instrukcja powrotu ma posta�
return e;
w kt�rej e jest wyra�eniem.
Wykonanie instrukcji powrotu powoduje zako�czenie wykonywania funkcji i dostarczenie rezultatu o warto�ci okre�lonej przez e.
int sum(int one, int two)
{
return one + two;
}
Je�li typem funkcji jest void, to u�yta w niej instrukcja powrotu nie mo�e zawiera� wyra�enia. U�ycie takiej instrukcji jest zazwyczaj zbyteczne, poniewa� domniemywa si� j� tu� przed klamr� zamykajac� cia�o funkcji.
void sum(int one, int two)
{
cout << one + two << endl;
return; // zb�dne
}
Instrukcja decyzyjna
Instrukcja decyzyjna uog�lnia instrukcj� warunkow� i jest przydatna w�wczas, gdy w programie wyst�puj� wi�cej ni� dwie ga��zie decyzyjne. W szczeg�lno�ci instrukcj� warunkow�
if(a == 2)
b = 3;
else if(a == 1)
b = 5;
else if(a == 4)
b = -1;
else
b = 0;
mo�na zapisa� w postaci
switch(a) {
case 2: // je�li a == 2
b = 3;
break;
case 1: // je�li a == 1
b = 5;
break;
case 4: // je�li a == 4
b = -1;
break;
default: // w pozosta�ych przypadkach
b = 0;
}
Deklarowanie zmiennych i typ�w
Ka�dy modu� programu jest kompilowany niezale�nie od pozosta�ych. Analiza sk�adniowa modu�u odbywa si� od-g�ry-do-do�u i od-lewej-do-prawej i polega na rozpoznawaniu jednostek leksykalnych: identyfikator�w (np.�exit), litera��w (np.�0), operator�w (np.�+) i ogranicznik�w (np.�;).
Identyfikatory
Identyfikatorem jest sp�jna sekwencja liter i cyfr, zaczynaj�ca si� od litery. Identyfikator nie mo�e mie� postaci s�owa kluczowego (np.�return). Za jego liter� uznaje si� r�wnie� znak podkre�lenia (_).
Litery ma�e uznaje si� za r�ne od du�ych. Zaleca si�, aby w wielos�owowych nazwach zmiennych i funkcji, wszystkie s�owa, z wyj�tkiem pierwszego, by�y zapisane za pomoc� du�ych liter.
np.
forSale speedLimit veryLongName
Litera�y
Litera�ami s� liczby (np.�12 i 2.e-3), znaki (np.�'a') i �a�cuchy (np. "Hello"). Ka�dy litera� jest nazw� zmiennej ustalonej. Jej typ wynika z zapisu litera�u.
Uwaga: Je�li �a�cuch ma zawiera� znak \ (uko�nik), to nale�y go zapisa� jako \\ (np. "C:\\Data.txt).
np.
-2.4 2.e4 .2 // nazwy zmiennych typu double
Deklaracje
Ka�de u�ycie identyfikatora musi by� poprzedzone jego deklaracj�. Deklaracja kompletnie opisuj�ca zmienn� (okre�laj�ca jej warto�� pocz�tkow�), typ (wyszczeg�lniaj�ca struktur� jego obiekt�w) i funkcj� (podaj�ca jej cia�o) jest nazywana definicj�.
W sk�ad deklaracji wchodz� specyfikatory, deklaratory i inicjatory.
np.
const int tab[3] = { -1, 0, +1 };
Specyfikatorami s� const i int, deklaratorem jest tab[3], a inicjatorem jest = {�-1,�0,�+1�}.
Nag��wki
Deklaracje typ�w i funkcji s� ujmowane w nag��wki. Ka�dy nag��wek jest zapisany w odr�bnym pliku. W��czenie nag��wka odbywa si� w miejscu wyst�pienia wyszczeg�lniaj�cej go dyrektywy #include.
Do najcz�ciej u�ywanych nag��wk�w nale��: iostream.h i iomanip.h, math.h, string.h i stdlib.h. Dwa pierwsze w��czaj� do modu�u deklaracje zmiennych i operator�w wej�cia-wyj�cia (cin, cout, >>, <<), dwa nast�pne w��czaj� deklaracje funkcji matematycznych (sqrt, sin, cos) i �a�cuchowych (strlen, strcpy, strcat, strcmp), a ostatni w��cza m.in. deklaracj� funkcji exit.
#include <iostream.h>
#include <math.h>
int main(void)
{
double number; // deklaracja zmiennej
cin >> number; // wprowadzenie liczby
cout << sqrt(number); // wyprowadzenie pierwiastka
return 0; // zako�czenie wykonywania
}
Zmienne
Zmienn� jest obszar pami�ci do przechowywania danych okre�lonego typu: skalarnych, tablicowych i strukturowych. Ka�de odwo�anie do zmiennej musi by� poprzedzone deklaracj� jej typu.
int fix; // zmienna ca�kowita
char chr; // zmienna znakowa
double num; // zmienna rzeczywista
Zmienna fix jest typu int, zmienna chr jest typu char, zmienna num jest typu double.
Rozmiar zmiennej
Rozmiar zmiennej w bajtach okre�la si� za pomoc� operatora sizeof. Argumentem operatora sizeof mo�e by� nazwa zmiennej albo nazwa typu.
Uwaga: Rozmiar zmiennej zale�y od implementacji. W Visual C++ zmienne typu char s� 1-bajtowe, zmienne typu int s� 2-bajtowe, a zmienne typu double s� 8-bajtowe.
int age = 24;
cout << sizeof(age); // 4
cout << sizeof(int); // 4
int tab[3];
cout << sizeof(tab); // 12
Zmienne ustalone
Zmienna zadeklarowana ze specyfikatorem const jest zmienn� ustalon�. Zmienna ustalona musi by� zainicjowana, ale nadana jej warto�� nie mo�e ulec zmianie.
Uwaga: Zmiennymi ustalonymi s� tak�e zmienne reprezentowane przez litera�y. W szczeg�lno�ci liczba 12e2 jest nazw� zmiennej ustalonej o warto�ci 1200.
const int size = 100;
const double width = -2e-7, height = 2e2;
const int tab[2] = { 10, 20 };
Zmienne skalarne
Deklaracja zmiennej skalarnej okre�la jej identyfikator oraz wyszczeg�lnia typ danych jakie mo�na przypisywa� zmiennej (np. int, double, char).
int number;
double speedLimit;
char separator;
Warto�� pocz�tkow� zmiennej okre�la si� za pomoc� inicjatora. Je�li deklaracja zmiennej zawiera jawny albo domniemany inicjator, to jest jej definicj�.
int minValue = 10, maxValue = 90;
double width = 2.4, height = 4.5e+2, area;
char lastChar = '.';
Sk�adnia inicjatora
Inicjatory dziel� si� na wyra�eniowe, klamrowe i nawiasowe. Inicjator zmiennej ustalonej musi mie� posta� wyra�enia sta�ego. W jego sk�ad wchodz� odwo�ania do litera��w i zmiennych ustalonych, ale nie mog� wchodzi� odwo�ania do zmiennych nie-ustalonych.
int base = 100; // inicjator wyra�eniowy
int min = { base + 20 }; // inicjator klamrowy
int max(base + 40); // inicjator nawiasowy
const int size = max - min; // b��d
Punkt zadeklarowania
Identyfikator zmiennej uwa�a si� za zadeklarowany w punkcie tu� przed inicjatorem wyra�eniowym i klamrowym, ale tu� po inicjatorze nawiasowym. Ta subtelna r�nica ma niekiedy wp�yw na poprawno�� i skutek wykonania programu.
#include <iostream.h>
const int val = 10; // definicja zmiennej globalnej
int main(void)
{
int val(val); // definicja zmiennej lokalnej
cout << val; // 10
return 0;
}
Punkt zadeklarowania zmiennej lokalnej wyst�puje tu� po inicjatorze (val). Gdyby inicjator nawiasowy zast�piono jednym z pozosta�ych inicjator�w, to program sta�by si� b��dny, poniewa� zmienna lokalna by�aby w�wczas inicjowana nie warto�ci� zmiennej globalnej, ale nieokre�lon� jeszcze warto�ci� zmiennej lokalnej.
Operacje wej�cia-wyj�cia
Zmienne typu int, double i char s� zmiennymi arytmetycznymi, przystosowanymi odpowiednio do przechowywania liczb ca�kowitych, zmiennopozycyjnych i kod�w znak�w.
Podczas wykonywania operacji wej�cia, do zmiennych typu int i double wprowadza si� dane liczbowe, a do zmiennych typu char wprowadza si� kody znak�w. A zatem, je�li z klawiatury wprowadzi si� na przyk�ad napis 20e3, to liczba pobranych znak�w i otrzymana warto�� b�dzie zale�e� od typu zmiennej, zgodnie z tabel� Wprowadzanie danych.
Tabela Wprowadzanie danych
###
Typ zmiennej Pobrano znak�w Wprowadzono warto��
int 2 20
double 4 20000
char 1 49
###
Podczas wykonywania operacji wyj�cia, wyprowadza si� liczby o warto�ci zmiennych typu int i double oraz znaki o kodach okre�lonych przez warto�ci zmiennych typu char.
#include <iostream.h>
int main(void)
{
int mant, exp;
char sep;
cin >> mant >> sep >> exp;
int value = mant;
while(exp > 0) {
value = value * 10;
exp--;
}
cout << mant << sep << exp <<
" == " << value << endl;
return 0;
}
Je�li wprowadzi si� napis 2e3, to program wyprowadzi ten napis oraz liczb� 2000.
Zmienne tablicowe
Zmienn� tablicow�, w skr�cie tablic�, jest zestaw s�siaduj�cych ze sob� element�w tablicy. Ka�dy element jest zmienn� takiego samego typu: skalarn�, tablicow�, strukturow�.
int tab[20];
Zmienna tab jest tablic� o 20-elementach typu int.
Z ka�dym elementem tablicy jest zwi�zany indeks, okre�laj�cy po�o�enie elementu w obr�bie tablicy. Elementy tablicy s� indeksowane od 0. W deklaracji tablicy podaje si� liczb� jej element�w, a nie indeks jej ostatniego elementu. Je�li deklarator nie podaje liczby element�w, ale deklaracja zawiera inicjator, to za liczb� element�w uznaje si� liczb� fraz inicjuj�cych.
Uwaga: Liczba fraz inicjuj�cych nie mo�e przekracza� liczby element�w tablicy. Jesli jest od niej mniejsza, to jest niejawnie dope�niana frazami 0.
int tab[100] = { 4, 4 };
Zerowy i pierwszy element tablicy tab ma warto�� 4. Wszystkie pozosta�e maj� warto�� 0.
Liczba element�w tablicy musi by� wyra�ona za pomoc� wyra�enia sta�ego. Wyra�enie sta�e mo�e zawiera� litera�y i identyfikatory zmiennych ustalonych, ale nie mo�e zawiera� operatora po��czenia.
const int Count = 3;
double sizes[Count] = { 2.4, 3.8, 5.2 };
int values[] = { 10, 20, 30, 40, 50 };
int Size = 4;
double reals[Size]; // b��d
Tablica sizes sk�ada si� z 3 zmiennych, z kt�rych ka�da jest typu double.
Tablica values sk�ada si� z 5 zmiennych, z kt�rych ka�da jest typu int.
Identyfikowanie element�w tablicy
Je�li nazw� tablicy jest vec, to nazw� jej elementu o indeksie ind jest vec[ind]. Jest to prawdziwe tylko w�wczas, gdy wyra�enie ind ma warto�� wi�ksz�-lub-r�wn� 0 i jednocze�nie mniejsz� od liczby element�w tablicy.
Uwaga: Je�li tablica vec ma n element�w, to zezwala si�, aby wyra�enie ind mia�o warto�� -1 oraz n, ale tylko w�wczas, gdy opracowanie wyra�enia vec[ind] nie ma na celu dokonania zmiany albo dostarczenia warto�ci elementu.
#include <iostream.h>
int values[5] = { 10, 20, 30, 40, 50 };
int main(void)
{
int index;
cin >> index;
if(index >= 0 && index < 5)
cout << values[index] << endl;
else
cout << "Wrong index" << endl;
return 0;
}
Program wyprowadza warto�� elementu o podanym indeksie. Je�li indeks nie mie�ci si� w domkni�tym przedziale [0 ; 4], to program wyprowadza napis Wrong index.
Tablice znakowe
Tablic� znakow� jest tablica o elementach typu char. Przechowuje si� w niej zazwyczaj ma�e liczby oraz kody znak�w.
Poniewa� Visual C++ u�ywa kodu ASCII, w kt�rym kodem cyfry 0 jest 48, wi�c zainicjowanie 4-elementowej tablicy znakowej kodami cyfr 0, 1 i 2 oraz kodem znaku '\0' mo�na wykona� na wiele sposob�w, w tym m.in.
char digits[] = { '0', '1', '2', '\0' };
char digits[] = { 48, 49, 50, 0 };
char digits[4] = { '0', '0'+1, '3'-1 };
char digits[4] = "012";
Z klawiatury mo�na wprowadza� tylko sp�jne ci�gi znak�w. Za ostatnim wprowadzonym znakiem umieszcza si� w�wczas specjalny znak o kodzie 0.
Je�li chce si� wyprowadzi� ci�g znak�w utworzony w tablicy programowo, to nale�y zako�czy� go znakiem o kodzie 0 (jego rozpoznanie spowoduje zako�czenie wyprowadzania znak�w).
#include <iostream.h>
char name[100];
int main(void)
{
cin >> name;
name[1] = 0;
cout << "Your initial is: " << name << endl;
return 0;
}
Program wprowadza imi�, a nast�pnie wyprowadza jego inicja�.
Litera�y �a�cuchowe
Litera� �a�cuchowy, na przyk�ad "Hello", ma posta� ci�gu znak�w uj�tego w cudzys�owy. Znaki specjalne s� w tym ci�gu reprezentowane przez nastepuj�ce symbole
\\ (uko�nik) \n (nowy wiersz) \t (tabulator),
\' (apostrof) \" (cudzys��w) \0 (znak o kodzie 0).
Ka�dy litera� �a�cuchowy, jest nazw� tablicy o elementach typu char, zainicjowanych kodami kolejnych znak�w litera�u oraz kodem znaku \0. W szczeg�lno�ci (w kodzie ASCII) litera� "No" jest nazw� 3-elementowej tablicy zainicjowanej liczbami 78, 111 i 0.
#include <iostream.h>
int main(void)
{
int i = 0;
while("Hello"[i] != 0) {
cout << "Hello"[i] << ' ';
i++;
}
cout << endl;
return 0;
}
Program wyprowadza kolejne znaki napisu Hello, po ka�dym znaku dodaj�c spacj�. Zako�czenie wykonywania nast�puje po rozpoznaniu elementu zainicjowanego liczb� 0.
Litera�y �a�cuchowe mog� by� u�yte do inicjowania tablic znakowych. Tak zainicjowana tablica musi mie� co najmniej tyle element�w ile ma tablica reprezentowana przez litera�. Je�li jest d�u�sza, to jej nadmiarowe elementy s� inicjowane liczbami 0.
char name1[10] = { 'I', 's', 'a', 0 };
char name2[10] = "Isa";
char name3[] = "Isa";
char name4[3] = "Isa"; // b��d
Operacje wej�cia-wyj�cia
Tablice znakowe mog� by� wykorzystane do wprowadzania z klawiatury sp�jnych ci�g�w znak�w. W takim przypadku argumentem operacji jest zazwyczaj nazwa tablicy, a wykonanie operacji powoduje umieszczenie w tablicy kod�w znak�w �a�cucha oraz kodu o warto�ci 0.
Poniewa� mo�e w�wczas doj�� do przepe�nienia tablicy, zaleca si� u�ycie manipulatora setw, zadeklarowanego w nag��wku iomanip.h, ograniczaj�cego liczb� wprowadzonych znak�w.
#include <iostream.h>
#include <iomanip.h>
char name[20];
int main(void)
{
cin >> setw(20) >> name;
name[1] = 0;
cout << "Your initial is: " << name << endl;
return 0;
}
Program wprowadza imi�, a nast�pnie wyprowadza jego inicja�. Aby zabezpieczy� si� przed wpisaniem do tablicy name wi�cej ni� 20 znak�w, u�yto manipulatora setw(20) zadeklarowanego w nag��wku iomanip.h.
Zmienne strukturowe
Zmienn� strukturow�, w skr�cie struktur�, jest zestaw s�siaduj�cych ze sob� element�w struktury. Ka�dy element struktury mo�e by� zmienn� innego typu: skalarn�, tablicow�, strukturow�.
Przed zadeklarowaniem zmiennej strukturowej nale�y zdefiniowa� jej typ. Deklaracja typu strukturowego sk�ada si� z deklaracji p�l struktury. Deklaracja pola struktury ma posta� deklaracji zmiennej.
struct Child {
char name[20];
int age;
};
Child isa = { "Isabel", 15 };
Struktura isa sk�ada si� z 2 zmiennych, opisanych przez pola name i age. Warto�ci pocz�tkowe element�w struktury okre�lono za pomoc� inicjatora klamrowego. U�ycie innych inicjator�w jest zabronione.
Identyfikowanie element�w
Je�li nazw� struktury jest str, a w opisie jej typu wyst�puje pole fld, to nazw� zmiennej odpowiadaj�cej temu polu jest str.fld.
#include <iostream.h>
#include <iomanip.h>
struct Child {
char name[20];
int age;
};
Child child;
int main(void)
{
cin >> setw(20) >> child.name >> child.age;
cout << child.name << " is "
<< child.age << " now" << endl;
return 0;
}
Zmienna child sk�ada si� z tablicy o elementach typu char i zmiennej skalarnej typu int. Program wprowadza imi� i wiek dziecka, a nast�pnie wyprowadza je.
Kopiowanie struktur
W odr�nieniu od tablic, kt�re mo�na kopiowa� tylko element-po-elemencie, kopiowanie struktur mo�e dotyczy� pe�nego zestawu jej element�w i to nawet w�wczas, gdy struktura zawiera tablice.
#include <iostream.h>
struct Child {
char name[20];
int age;
};
Child girl;
int main(void)
{
Child isa = { "Isabel", 15 };
girl = isa;
cout << girl.name << " is " << girl.age << endl;
return 0;
}
Program wyprowadza te same dane, kt�rymi zainicjowano struktur� isa.
Unia element�w
Struktura, kt�rej elementy s� rozmieszczone w pami�ci nie jeden-za-drugim, ale zawsze od tego samego miejsca, jest nazywana uni�. W celu zadeklarowania unii nale�y zamiast s�owa kluczowego struct u�y� s�owa union.
struct Number {
bool isFixed;
union {
int fixed;
double real;
};
};
Number num = { true, 12 };
if(num.isFixed)
cout << num.fixed << endl; // 12
else
cout << num.real << endl;
cout << num.real << endl; // b��d
W ka�dej chwili struktura num sk�ada si� ze zmiennych typu bool i int, albo ze zmiennych typu bool i double.
B��d polega na tym, �e w chwili gdy zmienna num sk�ada si� ze zmiennych typu bool i int, nast�puje odwo�anie do zmiennej typu double.
Przetwarzanie plik�w
Przetwarzanie plik�w odbywa si� za po�rednictwem zmiennych strumieniowych klas ifstream i ofstream, zadeklarowanych w nag��wku fstream.h. Po utworzeniu zmiennej strumieniowej nale�y otworzy� skojarzony z ni� plik, a nast�pnie upewni� si�, �e otwarcie by�o pomy�lne.
Po pomy�lnym otwarciu pliku, pochodz�cy z niego strumie� danych mo�na przetwarza� w taki sam spos�b, jak strumie� danych zwi�zany z klawiatur� albo z monitorem.
Stan strumienia
Pocz�tkowo strumie� znajduje si� w stanie dobrym, ale na skutek b��du operacji wej�cia-wyj�cia albo pr�by wprowadzenia nie istniej�cej danej, mo�e znale�� si� w stanie nie-dobrym (fail).
W stanie nie-dobrym wszystkie operacje na strumieniu s� ignorowane. Je�li dane przygotowano w�a�ciwie, a jako�� pami�ci zewn�trznej jest zadowalaj�ca, to stan nie-dobry oznacza, �e napotkano koniec strumienia.
Szczeg�lnym przypadkiem stanu nie-dobrego jest stan z�y (bad). Powstaje on w przypadku rozpoznania danych o z�ym formacie. Niestety, na skutek niefortunnych domniema�, wprowadzenie takiej "danej" jak 3e, zamiast 3e0 (w kontek�cie 3ex) nie zmienia stanu strumienia na z�y.
Uwaga: Do sprawdzenia czy stan strumienia jest z�y, s�u�y funkcja bad, a do sprawdzenia, czy strumie� znajduje si� w pozycji za ko�cem pliku, s�u�y funkcja eof. Funkcji tych u�ywa si� bardzo rzadko.
Zmienna plikowa
Je�li w miejscu wyst�pienia operacji wej�cia-wyj�cia odbywa si� takie badanie zmiennej plikowej, jakby dotyczy�o wyra�enia o warto�ci orzecznikowej, na przyk�ad
while(cin >> num) ...
albo
if(cin) ...
to w stanie dobrym jest dostarczana warto�� true, a w stanie nie-dobrym warto�� false.
Wprowadzanie danych
Zmienna strumieniowa u�yta do wprowadzania danych z pliku jest typu ifstream. Otwarcie pliku odbywa si� za pomoc� funkcji open, kt�rej pierwszym argumentem jest nazwa, a drugim tryb otwarcia pliku: ios::in. Je�li otwierany plik nie istnieje, to zostanie utworzony jako pusty. Aby tego unikn��, plik nale�y otworzy� w trybie ios::in | ios::nocreate.
Do zbadania, czy otwarcie pliku si� powiod�o, s�u�y funkcja is_open. Jej rezultat ma warto�� nie-zero tylko w�wczas, gdy otwarcie by�o pomy�lne.
#include <iostream.h>
#include <fstream.h>
#include <assert.h>
int sum = 0;
int main(void)
{
ifstream inp; // zmienna plikowa
inp.open("Data.txt", ios::in | ios::nocreate);
if(!inp.is_open()) {
cout << "File does not exist" << endl;
return -1;
}
int val;
while(inp >> val) // wprowad� i sprawd� stan
sum += val; // dosumuj
assert(!inp.bad()); // raczej zb�dne
cout << "Sum = " << sum << endl;
return 0;
}
Wykonanie programu powoduje wyprowadzenie sumy liczb ca�kowitych zawartych w pliku Data.txt.
Wywo�anie funkcji assert ma na celu upewnienie si�, �e strumie� nie znajduje si� w z�ym stanie. Gdyby tak by�o, to wykonanie programu zosta�oby zaniechane.
Wyprowadzanie danych
Zmienna strumieniowa u�yta do wyprowadzania danych do pliku jest typu ofstream. Otwarcie pliku odbywa si� za pomoc� funkcji open, kt�rej pierwszym argumentem jest nazwa, a drugim tryb otwarcia pliku: ios::out.
Je�li otwierany plik nie istnieje, to zostanie utworzony i otworzony jako pusty. Je�li ju� istnieje, to zostanie otworzony jako pusty.
Do zbadania, czy otwarcie pliku si� powiod�o, s�u�y funkcja is_open. Jej rezultat ma warto�� nie-zero tylko w�wczas, gdy otwarcie by�o pomy�lne.
#include <iostream.h>
#include <fstream.h>
int main(void)
{
ifstream inp;
inp.open("Data.txt", ios::in | ios::nocreate);
if(!inp.is_open()) {
cout << "Source does not exist" << endl;
return -1;
}
ofstream out;
out.open("Data2.txt", ios::out);
if(!out.is_open()) {
cout << "Target not opened" << endl;
return -1;
}
int val;
while(inp >> val)
out << val << endl;
cout << "Done!" << endl;
return 0;
}
Program kopiuje liczby ca�kowite z pliku Data.txt do pliku Data2.txt. Ka�d� kopiowan� liczb� umieszcza w nowym wierszu.
U�ycie klawiatury
Je�li dane wprowadza si� z klawiatury, to koniec strumienia okre�la si� za pomoc� znaku ko�ca: Ctrl-Z (na polskiej klawiaturze Ctrl-Y). W Visual C++ nast�pi w�wczas pomini�cie pierwszego znaku wyprowadzonego na konsol�.
Uwaga: Zaleca si�, aby znak ko�ca zosta� wprowadzony na pocz�tku nowego wiersza (po Enter).
#include <iostream.h>
int main(void)
{
int count = 0;
double tmp;
while(cin >> tmp)
count++;
cout << endl; // na po�arcie
cout << "Count = " << count << endl;
return 0;
}
Program zlicza dane liczbowe wprowadzone z klawiatury.
�rodowisko Visual C++
Program �r�d�owy sk�ada si� z modu��w �r�d�owych. Ka�dy modu� jest umieszczony w odr�bnym pliku z rozszerzeniem .cpp. Dodatkowo, w sk�ad programu mog� wchodzi� modu�y skompilowane (*.obj) i biblioteczne (*.lib).
W celu przekszta�cenia zestawu modu��w w program wykonalny, nale�y utworzy� projekt, umie�ci� go w przestrzeni roboczej, w��czy� do projektu nazwy plik�w z rozszerzeniami .cpp, .obj i .lib, a nast�pnie zbudowa� program. Zostanie on umieszczony w pliku z rozszerzeniem .exe.
Katalog
Zaleca si�, aby pliki programu znajdowa�y si� we w�asnym katalogu. Je�li dysponuje si� wolnym miejscem na przyk�ad w katalogu g��wnym dysku D:, to nale�y wywo�a� Eksplorator Windows, klikn�� na nazwie katalogu g��wnego i wyda� polecenie Plik / Nowy obiekt / Folder, a nast�pnie okre�li� nazw� swojego katalogu, na przyk�ad jbVisual.
Przestrze�
W celu utworzenia przestrzeni roboczej nale�y wyda� polecenie File / New, a nast�pnie (w zak�adce Workspaces) poda� nazw� przestrzeni, np. Workspace: jbSpace oraz okre�li� jej po�o�enie, np. Location: D:\jbVisual\jbSpace, po czym nacisn�� przycisk OK.
Je�li przestrze� ju� istnieje, to aby j� otworzy�, nale�y wyda� polecenie File / Open Workspace, wej�� do katalogu przestrzeni (np. jbSpace), a nast�pnie dwu-klikn�� na nazwie jbSpace.dsw.
Projekt
W celu utworzenia projektu nale�y wyda� polecenie File / New, a w zak�adce Projects poda� typ projektu: Win 32 Console Application i jego nazw�, np. Project name: jbTests. Po upewnieniu si�, �e projekt zostanie w��czony do bie��cej przestrzeni (Add to current workspace) o czym za�wiadczy Location:�D:\jbVisual\jbSpace\jbTests, nale�y nacisn�� przycisk OK.
Pliki
W celu utworzenia plik�w projektu nale�y wyda� polecenie File / New, a nast�pnie (w zak�adce Files), okre�li� rodzaj pliku
C/C++ Source File dla pliku z rozszerzeniem .cpp
C++ Header File dla pliku z rozszerzeniem .h
Text File dla pliku z rozszerzeniem .txt
nie zapominaj�c o podaniu jego nazwy (bez rozszerzenia), np. File name: Sum.
Po wykonaniu tych czynno�ci, w katalogu D:\jbVisual\jbSpace\jbTests powstanie plik Sum.cpp, a jego (pocz�tkowo pusta) zawarto�� ujawni si� odr�bnym oknie edycyjnym.
Je�li program wymaga utworzenia plik�w z danymi, to zaleca si� je umie�ci� w tym samym katalogu co pliki �r�d�owe. Dla wygody mo�na je do��czy� do plik�w projektu.
Budowanie projektu
W celu zbudowania projektu, to jest skompilowania jego wszystkich plik�w *.cpp, oraz ewentualnie jego plik�w *.obj i *.lib, nale�y klikn�� ikon� Build. Spowoduje to niezale�ne kompilacje wszystkich modu��w �r�d�owych oraz po��czenie ich w program wykonalny.
Przebieg budowania projektu jest diagnozowany w oknie Output. Je�li okno nie jest widoczne, to mo�na je wy�wietli� wydaj�c polecenie View / Output.
B��dy modu�u wyszczeg�lnia si� w oknie Output. Po rozpoznaniu ka�dego z nich podaje si� kr�tki opis przyczyny b��du i numer wiersza programu. Dwu-klikni�cie w obr�bie opisu b��du powoduje przeniesienie kursora w pobli�e miejsca, w kt�rym wykryto b��d.
W rzadkich przypadkach, gdy poprawno�� diagnozy budzi w�tpliwo�ci, zaleca si� zast�pienie polecenia Build poleceniem Build / Rebuild All.
Wykonanie programu
Program wykonalny, pod nazw� jbTests.exe jest umieszczany w podkatalogu jbTests\Debug. Je�li wykonuje si� bezb��dnie i jest nale�ycie wytestowany, to mo�e zosta� zoptymalizowany.
W celu zoptymalizowania programu nale�y wyda� polecenie Build / Set Active Configuration, a nast�pnie zamiast konfiguracji Win 32 Debug, wybra� konfiguracj� Win 32 Release. Po ponownym zbudowaniu projektu, w katalogu jbTests\Release, powstanie program znacznie kr�tszy, ale ju� bez informacji uruchomieniowych.
Zarz�dzanie projektami
Przestrze� robocza mo�e zawiera� wi�cej ni� jeden projekt, a projekt mo�e sk�ada� si� z wi�cej ni� jednego pliku.
Je�li przestrze� zawiera wi�cej ni� jeden projekt, to tylko jeden z nich mo�e by� aktywny, to jest taki, kt�rego dotycz� polecenia Build. Uaktywnienie projektu odbywa si� przez p-klikni�cie jego nazwy i wydanie polecenia Set Active Project.
W celu umieszczenia w przestrzeni dodatkowego projektu nale�y p-klikn�� nazw� przestrzeni, wyda� polecenie Add New Project to Workspace, a dalej post�powa� tak, jak podczas tworzenia pierwszego projektu.
W celu w��czenia do projektu dodatkowego pliku nale�y p-klikn�� nazw� projektu, a nast�pnie wyda� polecenie Add Files to Project i wybra� skopiowany plik.
Je�li w��czany do projektu plik �r�d�owy ju� istnieje, to nale�y skopiowa� go do katalogu projektowego (pos�uguj�c si� np. Eksploratorem Windows), a nast�pnie post�pi� tak, jak podczas dodawania pliku do projektu.
Dopasowanie oblicza
Oblicze �rodowiska uruchomieniowego sk�ada si� z menu oraz z pask�w, kt�re mo�na konfigurowa�. Odbywa si� to za pomoc� polecenia Tools / Customize umo�liwiaj�cego zarz�dzanie wy�wietlaniem pask�w edycyjnych, uruchomieniowych i innych.
Uruchamianie programu
Systematyczne wyszukiwanie b��d�w w programie odbywa si� za pomoc� uruchamiacza. W celu wy�wietlenia paska zawieraj�cego jego narz�dzia nale�y wyda� polecenie Tools / Customize / Toolbars, a nast�pnie odhaczy� nastaw� Debug.
Wykonanie programu nadzorowanego przez uruchamiacz zaczyna si� w konfiguracji Win32 Debug po wydaniu polecenia Build / Start Debug / Step into (F10). Program zatrzyma si� tu� przed przyst�pieniem do wykonania pierwszej funkcji (zazwyczaj funkcji main).
Pocz�wszy od tego momentu mo�na
Okre�la� argumenty funkcji g��wnej
Project / Settings // Debug, Program arguments
Zastawia� / usuwa� pu�apki
ikona Hand (F9)
Usuwa� pu�apki
Edit / Breakpoints / Remove All (Alt-F9)
Wykonywa� program krokowo
ikona Go (po zastawieniu pu�apki)
ikona Step over (F10)
ikona Step into (F11)
ikona Step out (Shift-F11)
Obserwowa� zmienne
ikona Quick Watch (Shift-F9)
Kompilacja warunkowa
Podczas uruchamiania programu przydaje si� ignorowanie jego wybranych fragment�w. Odbywa si� to za pomoc� dyrektyw kompilacji warunkowej: #if, #else, #endif.
Zinterpretowanie dyrektywy
#if c
kod-�r�d�owy
#else
kod-alternatywny
#endif
zaczyna si� od wyznaczenia warto�ci wyra�enia c (najcz�ciej liczby 1 albo 0). Je�li wyra�enie ma warto�� r�n� od 0, to ca�� dyrektyw� zast�puje si� napisem kod-�r�d�owy. W przeciwnym razie zast�puje si� j� napisem kod-alternatywny.
Uwaga: Je�li napis kod-�r�d�owy jest pusty, to dyrektyw� mo�na zapisa� bez frazy #else.
#include <iostream.h>
int main(void)
{
int one, two;
cin >> one >> two;
#if 1
cout << "Sum = ";
#endif
cout << one + two << endl;
return 0;
}
Program wyprowadza sum� pary danych wej�ciowych poprzedzaj�c j� napisem Sum =. Je�li w dyrektywie #if zmieni si� 1, na 0, to powstanie program, kt�ry takiego napisu nie wyprowadzi.
Wska�niki i odno�niki
Wska�niki i odno�niki s� zmiennymi, kt�re s�u�� do identyfikowania innych zmiennych. Wska�nik mo�e identyfikowa� wiele zmiennych pokrewnego mu typu, natomiast odno�nik mo�e identyfikowa� tylko jedn� zmienn�.
Wska�nikom przypisuje si� wskazania, a odno�nikom odniesienia. Mimo i� w typowych implementacjach zar�wno wskazania jak i odniesienia s� reprezentowane przez adresy, pos�ugiwanie si� poj�ciem adres jest ca�kowicie zbyteczne i dowodzi my�lenia o C++ nie w kategoriach j�zyka wysokiego poziomu, ale w kategoriach implementacji. Dlatego o adresach nie b�dzie ju� mowy.
Zmienne wska�nikowe
Wska�nikiem jest zmienna, kt�rej mo�na przypisywa� wskazania. Deklaracj� wska�nika mo�na pozna� po tym, �e jej identyfikator jest poprzedzony symbolem *�(gwiazdka).
Je�li w pewnym miejscu programu jest wymagane u�ycie wskazania zmiennej, to otrzymuje si� je poprzedzaj�c nazw� zmiennej operatorem wskazywania & (ampersand).
Po przypisaniu wska�nikowi ptr wskazania zmiennej, napis *ptr staje si� chwilow� nazw� tej zmiennej. Po przypisaniu wska�nikowi wskazania pustego (reprezentowanego przez liczb� 0), u�ycie nazwy *ptr albo nazwy jej r�wnowa�nej (np. ptr[0]) jest zabronione.
int fix1 = 10,
fix2 = 20;
int *ptr = &fix1;
cout << *ptr; // 10
*ptr = 11;
cout << *ptr << fix; // 11 11
ptr = &fix2;
cout << *ptr; // 20
*ptr = 22;
cout << *ptr << fix; // 22 22
ptr = 0;
cout << *ptr; // b��d
Wska�nik ptr jest przystosowany do wskazywania zmiennych typu int. Przypisano mu kolejno: wskazanie zmiennej fix1, wskazanie zmiennej fix2 i wskazanie puste.
Po przypisaniu wska�nikowi ptr wskazania zmiennej fix1, napis *ptr jest chwilow� nazw� zmiennej fix1, a po przypisaniu mu wskazania zmiennej fix2, jest chwilow� nazw� zmiennej fix2.
Po przypisaniu wska�nikowi ptr wskazania pustego, a� do chwili przypisania mu wskazania zmiennej, u�ycie nazwy *ptr jest zabronione.
Dla dociekliwych
Typ wyra�enia inicjuj�cego wska�nik musi by� zgodny z typem wska�nika. Przyjmuje si� z definicji, �e zgodne ze wska�nikiem typu Type jest ka�de wyra�enie typu Type oraz ka�de wyra�enie, kt�re mo�e by� poddane niejawnej konwersji do typu Type (por.�Dodatek C).
char *ptr1 = "0\0\0\0" // niejawna konwersja
int *ptr2 = "0\0\0\0"; // b��d
int *ptr = (int *)"0\0\0\0"; // jawna konwersja
cout << *ptr; // 48 (kod cyfry 0)
Skutek u�ytej tu jawnej konwersji zale�y od implementacji. W Visual C++ powoduje to potraktowanie obszaru pami�ci zaj�tego przez pierwsze 4 bajty litera�u jako zmiennej ca�kowitej.
Wska�niki i tablice
Zwi�zki mi�dzy wska�nikami i tablicami s� bardzo bliskie. Ka�da nazwa tablicy jest niejawnie przekszta�cana na wska�nik jej zerowego elementu, a ka�da nazwa wska�nika mo�e by� indeksowana tak, jak nazwa tablicy.
Je�li wska�nik ptr wskazuje pewien element tablicy, to zar�wno *ptr jak i ptr[0] jest nazw� tego elementu. Elementy po�o�one z lewej strony elementu wskazywanego maj� nazwy ptr[-1], ptr[-2], itd., a elementy po�o�one z prawej maj� nazwy ptr[1], ptr[2], itd.
Je�li i jest wyra�eniem ca�kowitym, to wyra�enie ptr+i jest wska�nikiem elementu odleg�ego o i element�w od wskazywanego (dla i ujemnego - w lewo, a dla i dodatniego - w prawo).
Je�li wska�niki ptr1 i ptr2 wskazuj� odpowiednio elementy o indeksach i oraz j tej samej n-elementowej tablicy (a tak�e gdy wskazuj� nie istniej�ce "elementy" o indeksach -1 i n), to wyra�enie ptr1-ptr2 ma warto�� i-j.
int vec[3] = { 10, 20, 30 };
int *ptr = vec + 2;
cout << ptr++[-1]; // 20
cout << *(vec + 2); // 30
cout << vec - ptr; // -3
Nazwa vec zostaje niejawnie przekszta�cona na wskazanie elementu vec[0], to jest na &vec[0].
Wyra�enie vec + 2 wskazuje element o warto�ci 30.
Wyra�enie ptr++[-1] jest nazw� elementu o warto�ci 20.
W wyra�eniu vec�-�ptr pierwszy argument wskazuje element zerowy, a drugi argument wskazuje nie istniej�cy element vec[3].
Wska�niki i struktury
Je�li wska�nik ptr wskazuje struktur� o polu f, to nazw� zmiennej odpowiadaj�cej temu polu jest (*ptr).f, albo kr�cej ptr->f.
#include <iostream.h>
struct Child {
char name[20];
int age;
Child *pNext;
};
Child bob = { "Robert", 20 },
tom = { "Thomas", 30, 0 };
Child *pBob = &bob,
*pTom = &tom;
int main(void)
{
cout << pBob->name << endl; // Robert
pBob->pNext = pTom;
cout << pBob->pNext->age << endl; // 30
return 0;
}
Zmienna pBob jest wska�nikiem przystosowanym do wskazywania zmiennych typu Child. Przypisano jej wskazanie struktury bob.
Napis pBob->name jest chwilow� nazw� tego elementu struktury bob, kt�ry jest opisany przez pole name.
Napis pBob->pNext jest nazw� wska�nika opisanego przez pole pNext. Poniewa� wskazuje on struktur� tom, wi�c pBob->pNext->age jest nazw� tego elementu struktury tom, kt�ry jest opisany przez pole age.
Tablice wska�nik�w
Tablic� wska�nik�w jest tablica, kt�rej elementami s� wska�niki. W deklaracji tablicy wska�nik�w jej identyfikator jest poprzedzony znakiem * (gwiazdka).
W deklaracji wska�nika, kt�ry s�u�y do wskazywania-wska�nik�w, jego identyfikator jest poprzedzony dwiema znakami * (gwiazdka).
#include <iostream.h>
const int Count = 3;
struct Child {
char name[20];
int age;
};
Child john = { "John Smith", 30 },
tom = { "Thomas Mill", 10 },
bill = { "Robert Dole", 20 };
Child *pBoys[Count] = { &john, &tom, &bill };
int main(void)
{
for(int i = 0; i < Count-1 ; i++) {
int minAge = pBoys[i]->age;
for(int j = i+1; j < Count ; j++) {
if(pBoys[j]->age < minAge) {
minAge = pBoys[j]->age;
Child *ptr = pBoys[i];
pBoys[i] = pBoys[j];
pBoys[j] = ptr;
}
}
}
Child **ptr = pBoys;
for(i = 0; i < Count ; i++)
cout << (*ptr++)->name << endl;
return 0;
}
Program wyprowadza nazwiska ch�opc�w, w kolejno�ci ich rosn�cego wieku. Sortowanie dotyczy tylko element�w tablicy wska�nik�w i nie powoduje kopiowania struktur typu Child.
Wska�niki a ustalenia
Podobnie jak zwyk�a zmienna, tak i wska�nik mo�e by� ustalony albo nie-ustalony. Ponadto wska�nik mo�e by� przystosowany do wskazywania zmiennych ustalonych albo nie-ustalonych. Daje to cztery mo�liwo�ci.
Uwaga:�Zabrania si�, aby wska�nikowi przystosowanemu do wskazywania zmiennych nie-ustalonych przypisano wskazanie zmiennej ustalonej.
#include <iostream.h>
int main(void)
{
int mod = 10;
const int fix = 20;
int *ptr1 = &mod;
int *const ptr2 = &mod;
const int *ptr3 = &mod;
const int *const ptr4 = &fix;
cout << *ptr1 << endl; // 10
cout << *ptr2 << endl; // 10
cout << *ptr3 << endl; // 10
cout << *ptr4 << endl; // 20
ptr1 = &fix; // b��d
++ptr2; // b��d
++*ptr3; // b��d
ptr1 = &(int &)fix; // dozwolone
cout << *ptr1 << endl; // 20
return 0;
}
Wska�nik ptr1 s�u�y do wskazywania zmiennych nie-ustalonych. Wska�nik ptr2 jest wska�nikiem ustalonym, kt�ry s�u�y do wskazywania zmiennych nie-ustalonych. Wska�nik ptr3 jest wska�nikiem nie-ustalonym, kt�ry s�u�y do wskazywania zmiennych ustalonych. Wska�nik ptr4 jest wska�nikiem ustalonym, kt�ry s�u�y do wskazywania zmiennych ustalonych.
Zmienne odno�nikowe
Odno�nikiem jest zmienna, kt�r� mo�na zainicjowa� odniesieniem. Deklaracj� odno�nika mo�na pozna� po tym, �e jej identyfikator jest poprzedzony symbolem &�(ampersand).
Uwaga: Je�li w pewnym miejscu programu wyst�puje nazwa zmiennej, a program by�by poprawny tylko w�wczas, gdyby wyst�powa�a tam nazwa odno�nika do zmiennej, to nazw� zmiennej niejawnie przekszta�ca si� w odno�nik.
int fix = 10;
int &ref = fix; // int &ref = (int &)fix;
Poniewa� odno�nik ref jest typu int &, wi�c nie mo�e by� zainicjowany warto�ci� zmiennej fix, kt�ra jest typu int. Dlatego, za pomoc� niejawnej konwersji (int &)fix, nazw� zmiennej fix niejawnie przekszta�ca si� w odno�nik.
Po zainicjowaniu odno�nika ref odniesieniem do zmiennej, napis ref staje si� trwa�� nazw� tej zmiennej. A wi�c odno�nik mo�na zainicjowa�, ale nie mo�na mu przypisa� odniesienia.
#include <iostream.h>
int main(void)
{
int fix = 10;
int &ref = fix;
ref = 10;
cout << fix << ref << endl; // 10 10
return 0;
}
Po zainicjowaniu odno�nika, napis ref staje si� trwa�� nazw� zmiennej fix. Dlatego przypisanie ref = 10 zmienia warto�� zmiennej fix, ale nie zmienia warto�ci odno�nika ref.
Dla dociekliwych
Typ wyra�enia inicjuj�cego odno�nik musi by� zgodny z typem odno�nika. Przyjmuje si� z definicji, �e typ "odno�nik do zmiennej typu Type" (np.�int &) jest zgodny z typem Type (np.�int). Je�li wyra�enie inicjuj�ce jest innego typu, to mo�e by� poddane niejawnej konwersji do typu zgodnego, ale tylko w�wczas, gdy typ odno�nika jest ustalony (const). W takim wypadku odno�nik zostanie zainicjowany odniesieniem do zmiennej pomocniczej typu z nim zgodnego, zainicjowanej warto�ci� wyra�enia po konwersji.
int &ref1 = 2.4; // b��d
const int &ref = 2.4;
Identyfikator ref2 jest trwa�� nazw� zmiennej pomocniczej o warto�ci (int)2.4.
Wska�niki i odno�niki
Podejmuj�c decyzj� o u�yciu wska�nika, czy odno�nika, nale�y kierowa� si� wytyczn�, �e wsz�dzie tam gdzie jest to mo�liwe, nale�y stosowa� odno�niki, gdy� zwi�ksza to czytelno�� programu.
W rzadkich przypadkach stosuje si� odno�niki do wska�nik�w. Jest to niezb�dne w�wczas, gdy poprzez odno�nik nale�y zmodyfikowa� wska�nik.
#include <iostream.h>
int main(void)
{
int vec[3] = { 10, 20, 30 };
int *ptr = vec;
int *&ref = ptr;
++ref;
cout << *ptr << endl; // 20
return 0;
}
Po zadeklarowaniu odno�nika, napis ref jest trwa�� nazw� wska�nika ptr. Dlatego po wykonaniu operacji ++ref wsk