Разница между void* и char*

char srch(char x[],char k){
int i=0;
while(x[i]!='\0')
{
    if(k==x[i])
    {
       const char *h=&(x[i]);
       const void *l = h;
       cout<<"\n\nTHE CHARACTER "<<x[i]<<" FOUND AT ADDRESS "<<l<<"\n\n\n";
       exit(0);
    }
    i++;
}
return NULL;
}

int main(){
system("cls");
char str[20],ch;
cout<<"ENTER THE STRING:-\n";
gets(str);
cout<<"ENTER THE CHARACTER WHICH YOU WANT TO SEEK:-\n";
cin>>ch;

srch(str,ch);

if(NULL);
cout<<"\n\nCHARACTER NOT FOUND ";}

ТЕПЕРЬ, если моя строка "tarun" и мой символ для поиска - "a", то он отлично показывает адрес "a". НО, если я заменю свою функцию srch на это:-

    char srch(char x[],char k){
int i=0;
while(x[i]!='\0')
{
    if(k==x[i])
    {
       const char *h=&(x[i]);
       const char *l = h;
       cout<<"\n\nTHE CHARACTER "<<x[i]<<" FOUND AT ADDRESS "<<l<<"\n\n\n";
       exit(0);
    }
    i++;
}
return NULL;}

тогда вместо адреса он показывает арун. Почему это произошло, когда я использовал char* вместо void*?

1 ответ

Решение

Символьный указатель ( char* ) перегружен оператор вывода (operator<<) и печатает нижележащую строку в стиле C вместо адреса указателя. Эта перегрузка существует для поддержки кода, подобного этому:

std::cout << "some string";

"some string" тип на самом деле const char* без перегрузки он напечатал бы адрес строки вместо самой строки.

Пустой указатель ( void* ) или любой другой тип указателя (AFAIK) не обеспечивает такого рода перегрузки, поэтому напечатанное значение является адресом указателя.

Другие вопросы по тегам