Различия в указателях C ++ - PullRequest
0 голосов
/ 28 мая 2019

Может кто-нибудь объяснить мне разницу между следующими?

  1. Эти двое
float *pointer[10];

float *(pointer[10]);
и эти двое
int(*pointer_function)();

int *pointer_function();

Ответы [ 2 ]

3 голосов
/ 28 мая 2019

эти две декларации

float *pointer[10];

float *(pointer[10]);

эквивалентны. Вы можете написать даже следующим образом

float *( ( pointer )[10] );

То есть это объявление массива из 10 указателей для плавания.

Эти декларации

int(*pointer_function)();

int *pointer_function();

разные. Первый объявляет указатель на функцию типа int(). Второй объявляет функцию (не указатель на функцию) с типом int *().

Вот демонстрационная программа

#include <iostream>

int * pointer_function() // #1
{
    static int x = 1'000'000;

    return &x;
};

int f1() // #2
{
    return 2'000'000;
}

int main()
{
    std::cout << *pointer_function() /* calling #1 */<< '\n';

    int( *pointer_function )() = f1;

    std::cout << pointer_function() /* calling #2 */ << '\n';


    return 0;
}

Его вывод

1000000
2000000

Чтобы сделать более очевидной разницу между объявлениями, вы можете переписать второе объявление (то есть объявление функции) следующим образом

int * ( pointer_function )();

Сравните это с указателем на объявление функции

int ( *pointer_function )();

Учтите, что декларатор может быть заключен в скобки.

0 голосов
/ 28 мая 2019

Всегда помните о месте скобок. Круглые скобки не изменяют тип объекта, но могут изменять привязку сложных деклараторов.

Фрагмент кода сверху:

float *pointer[10];// Array of 10 pointer to float

float *(pointer[10]); //bracket around array of 10 pointer to float, So same as above

int(*pointer_function)(); // function pointer to achieve callbacks

int * pointer_function(); // function to integer pointer
...