Покажчики – це змінні, які містять адресу іншої змінної або функції. Покажчики оголошуються за допомогою символу *.
int i, *pi = &i; // покажчик на int
int *ppi = π // покажчик на покажчик на int
char (*pvc)[5]; // покажчик на вектор char[5]
float (*pf)(int); // покажчик на функцію, що приймає параметр int і
// що повертає float
Надають функціям механізм зміни значень аргументів.
inline void Swap (int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
// ...
Swap (&x, &y); // повинні передаватися адреси
Покажчики можуть мати тип «покажчик на void», що означає, що даний покажчик адресує будь-який об’єкт, котрий не має ні тип const, ні тип volatile. Перетворення покажчика в покажчик на void повинне бути явним. Для зворотного перетворення покажчика на void у покажчик на реальний об’єкт потрібна операція приведення типу.
char c, *p = &c;
void *v = p; // явне перетворення
char* q = (char*) v; // необхідне явне приведення
Приклад:
//Strlen.cpp
#include <iostream>
using namespace std;
int strlen(char* p)
{
int i = 0;
while(*p++) i++;
return i;
}
void main()
{
char* str = "Hello, there!";
cout<<"Strlen "Hello, there!" is "<<strlen(str)<<endl;
}
Приклад:
// ASCIIcode.cpp
#include <iostream>
using namespace std;
void main()
{
char alpha[] = "abcdefghijklmnopqrstuvwxyz";
char* p = alpha; // char* p = &alpha[0];
char ch;
while(ch = *p++)
cout<<ch<<" = "<<int(ch)<<'n';
}
2. Покажчики на функції
//QSorter.cpp
#include <cstdio>
#include <cstdlib>
#include <ctime>
#define ARRAYSIZE 100
int compare(const void* a, const void* b);
void FillArray(void);
void DisplayArray(void);
void SortArray(int n);
int array[ARRAYSIZE];
main()
{
FillArray();
DisplayArray();
SortArray(ARRAYSIZE);
DisplayArray();
return 0;
}
int compare(const void* a, const void* b)
{
int aint = *(int*)a;
int bint = *(int*)b;
if(aint<bint)
return -1;
else if(aint>bint)
return +1;
else
return 0;
}
// Заповнення глобального масиву
void FillArray(void)
{
int i;
srand((unsigned)time(NULL)); // рандомізація
for(i=0;i<ARRAYSIZE;i++) //заповнення масиву
array[i] = rand();
}
void DisplayArray(void)
{
int i;
puts(""); // початок нового рядка
for(i=0;i<ARRAYSIZE;i++)
printf("%8d", array[i]);
}
void SortArray(int n)
{
if(n>1)
qsort((void*)array, n, sizeof(array[0]), compare);
}