Какво е void* в C и C++

Kakvo E Void V C I C



C и C++ са два езика за програмиране, които разчитат до голяма степен на указатели за управление на паметта и манипулиране на данни. Указателите са променливи, които съхраняват адреси на паметта, което позволява на програмите да имат достъп и да манипулират данни, съхранявани в паметта. Един специален тип указател е void указател (void*) , известен също като a общ указател .

Какво е Void Pointer (void*)?

Празен указател, известен също като общ указател, е указател, който не е свързан с конкретен тип данни, което го прави подходящ за посочване към всякакъв тип данни. С други думи, a празен указател може да сочи към цяло число, знак, низ или друг тип данни. Тази гъвкавост прави void указателите мощен инструмент в C и C++ програмирането.

Декларация на Void Pointer в C и C++

В C и C++, празен указател се декларира чрез следния синтаксис:







невалиден * ptr ;

Използване на Void Pointers в C и C++

Празни указатели в C се използват най-вече, когато типът данни на променлива не е известен или може да варира по време на изпълнение. Те позволяват общ начин за съхраняване и манипулиране на данни, без да е необходимо да знаете техния специфичен тип данни. Това е полезно, особено когато се работи с функции или структури от данни, които могат да обработват различни типове данни.



Една често срещана употреба на празни указатели е във функциите за разпределение на паметта като malloc() който връща празна точка на указател към блок памет, който може да се използва за съхраняване на всеки тип данни. След това програмистът може да прехвърли празния указател към подходящия тип данни за достъп и манипулиране на данните, съхранени в разпределения блок памет.



Друга употреба на празни указатели в C е in функционални указатели , които са променливи, които съхраняват адреса на паметта на функция. Void указателите могат да се използват за съхраняване на адреса на паметта на всяка функция, независимо от нейния тип връщане или списък с параметри, което позволява по-голяма гъвкавост при използването на указател на функция.





Използването на празни указатели в C++ е почти подобен, но те могат да се използват и за създаване на общ интерфейс за обекти от различни класове. Това често се постига чрез използването на виртуални функции, които позволяват обекти от различни класове да бъдат третирани еднакво. Освен това C++ предлага по-строга проверка на типа от C, което означава, че използването на празни указатели неправилно може да доведе до повече грешки и бъгове.

Точки, които трябва да имате предвид при използване на Void указатели в C и C++

Ето няколко точки, които трябва да имате предвид, докато използвате празни указатели в C и C++.



1: В C, празнота* може да се използва като върната стойност и функционален параметър, но в C++ трябва да имате конкретен тип данни на указателя.

Например:

В C кодът е даден по-долу:

#include

#include

невалиден * добавяне на числа ( вътр а , вътр b ) {

вътр * резултат = malloc ( размер на ( вътр ) ) ;

* резултат = а + b ;

връщане ( невалиден * ) резултат ;

}

невалиден печат_резултат ( невалиден * резултат ) {

вътр * ptr = ( вътр * ) резултат ;

printf ( „Резултатът е: %d ' , * ptr ) ;

Безплатно ( ptr ) ;

}

вътр основен ( ) {

вътр номер1 = 5 , бр.2 = 7 ;

невалиден * резултат = добавяне на числа ( номер1 , бр.2 ) ;

печат_резултат ( резултат ) ;

връщане 0 ;

}

Горният код дефинира функция add_numbers() който връща a празнота* указател към резултата от добавянето на две цели числа, предадени като аргументи. Функцията print_result() отнема a void * показалец и отпечатва резултата. Във функцията main() извикваме add_numbers() и прекарайте полученото void * показалец да се print_result() за печат.

В C++ се изисква специфичен тип данни.

#include

използване на пространство от имена std ;

невалиден printInt ( вътр * никой ) {

cout << 'Цялото число е: ' << * никой << endl ;

}

вътр основен ( ) {

вътр х = 10 ;

вътр * ptr = и х ;

printInt ( ptr ) ;

връщане 0 ;

}

2: В C можете да конвертирате празния указател в друг тип указател чрез имплицитно преобразуване. Но в C++ трябва да използвате изрично преобразуване за преобразуване на празен указател към всеки друг тип указател.

Ето прост пример за код за C и C++, за да илюстрирате разликата между имплицитно и изрично преобразуване на празни указатели към други типове указатели:

В C се използва следният код:

#include

невалиден printChar ( невалиден * гл ) {

въглен ° С = * ( въглен * ) гл ;

printf ( '%° С ' , ° С ) ;

}

вътр основен ( ) {

въглен ° С = 'а' ;

невалиден * ptr = и ° С ;

printChar ( ptr ) ;

връщане 0 ;

}

Горният код дефинира функция printChar който приема празен указател като параметър и отпечатва знака, съхранен в това място в паметта. В основната функция, променлива char ° С е дефиниран и адресът му се съхранява в празен указател ptr. The printChar след това функцията се извиква с празен указател 'ptr' като аргумент. Указателят void се преобразува изрично в указател char в „printChar“ функция за достъп и отпечатване на стойността, съхранена в '° С' .

В C++ кодът е даден по-долу:

#include

невалиден printInt ( невалиден * никой ) {

вътр * ptr = static_cast < вътр *> ( никой ) ;

std :: cout << * ptr << std :: endl ;

}

вътр основен ( ) {

вътр х = 10 ;

невалиден * ptr = и х ;

printInt ( ptr ) ;

връщане 0 ;

}

Горният код дефинира функция printInt който приема празен указател num като параметър и го прехвърля към целочислен указател, използвайки оператор static_cast . След това функцията отпечатва стойността на цялото число, към което сочи предаденият указател. В основната функция е дефинирана целочислена променлива x и нейният адрес се съхранява в a празен указател ptr, който след това се предава на printInt функция. Резултатът от програмата е стойността на x, която е 10.

Последни мисли

The невалиден указателите в C и C++ предоставят мощен начин за манипулиране на данни, без да е необходимо да знаете техния специфичен тип данни. Те са полезни за разпределение на паметта и функционални указатели, както и за създаване на общ интерфейс за обекти от различни класове в C++. Въпреки това е важно да се вземат предвид разликите между C и C++ в тяхното използване на празни указатели , като необходимостта от специфични типове данни в C++ и необходимостта от изрично преобразуване при прехвърляне на празни указатели към други типове указатели. Внимателното разглеждане на тези точки може да доведе до по-ефективно и ефективно използване на празни указатели в програмирането.