C ++ указател за void (с примери)

В този урок ще научим за кухи указатели и как да ги използваме с помощта на примери.

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

Интересни статии...