В този урок ще научим за кухи указатели и как да ги използваме с помощта на примери.
Преди да продължите с този урок, не забравяйте да проверите указателите на 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;