Покажчики

Покажчики – це змінні, які містять адресу іншої змінної або функції. Покажчики оголошуються за допомогою символу *.

 

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);

}