Указатели на функии С++

344
03 июня 2017, 17:10

Разбираю указатели на функции,и решил реализовать. Функция, сама по себе простенькая, подсчет количества слов в строке. Но не работает именно указатель на ф-цию, судя из цитаты у меня все правильно,как мне кажеться. Проблема конкретно в строке char(*kilsliv)(int); Выдает error: invalid conversion from 'char*' to 'int' [-fpermissive] Как исправить, и в чем проблема?Спасибо!

> double (*pfunc)( double );

В момент этого объявления указатель pfunc

представляет собой ничего более, как некоторый адрес во внутреннем представлении компьютера (4 байта в 32-бит операционной системе, 8 байт в 64-бит операционной системе). Это в точности тот же внутренний вид, который имеет, скажем, указатель на целочисленную переменную int*. Но этот указатель имеет свой строго определённый тип: указатель на функцию, принимающую один параметр типа double, и возвращающую значение типа double. Но вот на какую конкретно функцию указывает указатель, в точке его определения — не важно: значение указателя не определено. взято отсюда.

#include <iostream>
using namespace std;
 int kilsliv(char*strq)
 {
   int q=0;
    for(int i=0;i<20;i++)
    {
      if(strq[i]==' ')
      q+=1;
    }
   return q+1;
 }
int main()
{
    setlocale(LC_ALL, "rus");
    char str[20]="";
    cin.getline(str,20);
    char(*kilsliv)(int);
    cout << str << endl;
 cout<<"kilkist sliv ="<<kilsliv(str)<<endl;
    return 0;
}
Answer 1

Вот тут:

char(*kilsliv)(int);

вы объявляете локальный указатель kilsliv на функцию, которая принимает int и возвращает char. Более того это объявление перекрывает функцию из глобальной области видимости. Вот тут:

cout<<"kilkist sliv ="<<kilsliv(str)<<endl;

вы пытаетесь вызвать функцию по указателю м параметром char*, хотя она принимает int. Более того этот указатель ничем не был инициализирован. И если у вас даже получится вызвать функцию по этому указателю (например с флагом -fpermissive скомпилировав), то скорее всего вы получите Segmentation fault, так как указатель ведёт куда-то не туда.
Но можно создать указатель на функцию такую же, как kilsliv и инициализировать его:

int(*f)(char*) = kilsliv;

Теперь при фызове f() будет вызывать функция определенная как kilsliv, так как это указатели и указывают они теперь на одну область памяти.

READ ALSO
UML диаграммы в Visual Studio 2015

UML диаграммы в Visual Studio 2015

Как составить UML диаграммы по написанному коду в Visual Studio 2015 Community Edition?

533
Работа с файлами в с++ [требует правки]

Работа с файлами в с++ [требует правки]

Помогите пожалуйста, суть задания нужно создать игру,угадай числоесли диапазон чисел начинающихся с 0 и 1 и пользователь должен угадать число...

291
Как превратить массив в двумерный

Как превратить массив в двумерный

Написал код по рандомному формированию массиваТеперь хочу что бы он стал двумерным

380
обертка над сокетами кидает исключение

обертка над сокетами кидает исключение

здравствуйте, решил написать небольшую обертку над си-шными сокетами, подскажите почему вылетает sigpipe в функции write?

330