В този урок ще научим за кухи указатели и как да ги използваме с помощта на примери.
Преди да продължите с този урок, не забравяйте да проверите указателите на C ++.
В C ++ не можем да присвоим адреса на променлива от един тип данни на указател от друг тип данни. Помислете за този пример:
// pointer is of int type int *ptr; // variable is of double type double d = 9.0; // Error // can't assign double* to int* ptr = &d;
Тук възникна грешката, защото адресът е doubleпроменлива на типа. Показалецът обаче е от intтип.
В такива ситуации можем да използваме показалеца за void (void pointers) в C ++. Например,
// void pointer void *ptr; double d = 9.0; // valid code ptr = &d;
В невалидни показалеца е общ указател, който се използва, когато не знаем типа данни на променливата, която сочи указателят.
Пример 1: C ++ Void Pointer
#include using namespace std; int main() ( void* ptr; float f = 2.3f; // assign float address to void ptr = &f; cout << &f << endl; cout << ptr << endl; return 0; )
Изход
0xffd117ac 0xffd117ac
Тук на показалеца ptrе дадена стойността на &f.
Резултатът показва, че указателят void ptr съхранява адреса на floatпроменлива f.
Както voidи празният тип, указателите за празнота не могат да бъдат разграничени.
void* ptr; float* fptr; float f = 2.3; // assign float address to void pointer ptr = &f; cout << *ptr << endl; // Error // assign float address to float pointer fptr = &f; cout << *fptr << endl; // Valid
Пример 2: Отпечатване на съдържанието на Void Pointer
За да отпечатаме съдържанието на празен указател, използваме static_castоператора. Той преобразува показалеца от void*тип в съответния тип данни на адреса, който съхранява указателят:
#include using namespace std; int main() ( void* ptr; float f = 2.3f; // assign float address to void pointer ptr = &f; cout << "The content of pointer is "; // use type casting to print pointer content cout << *(static_cast(ptr)); return 0; )
Изход
Съдържанието на указателя е 2.3
Тази програма отпечатва стойността на адреса, посочен от voidуказателя ptr.
Тъй като не можем да преориентираме voidуказател, не можем да използваме *ptr.
Ако обаче преобразуваме void*типа на указателя в float*типа, можем да използваме стойността, посочена от voidпоказалеца.
В този пример използвахме static_castоператора, за да преобразуваме типа данни на показалеца от void*в float*.
Кастинг в С стил
Също така можем да използваме отливане в стил С, за да отпечатаме стойността.
// valid cout << *((float*)ptr);
Въпреки това static_castсе предпочита пред кастинг в С стил.
Забележка: невалидни указатели не могат да се използват за съхраняване на адреси на променливи с constили volatileквалификатори.
void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;








