Как напечатать фактическое число из этой программы, содержащей функцию, возвращающую указатель?

#c #pointers

Вопрос:

 #include <stdio.h>

int *max(int *, int *);

int main()
{
    int *p, i, j;
    p = max(amp;i, amp;j);
    
    printf("%dn", i);

    return 0;
}

int *max(int *a, int *b)
{
    if(*a > *b)
        return a;
    
    else
        return b;
}
 

Это программа, предназначенная для возврата большего целого числа. Функция «max» возвращает указатель, как вы можете видеть. Я хочу напечатать здесь фактическое целое число, но я застрял и не могу найти правильный способ для этого. Может ли кто-нибудь помочь или дать какой-нибудь намек, чтобы решить мою проблему?

Кроме того, я хотел бы знать, почему перед функцией «max»должна быть звездочка. Всегда ли должна быть звездочка, когда функция возвращает указатель? В книге, которую я сейчас изучаю, отсутствует информация об этой конкретной части, так что может ли кто-нибудь почесать мне спину? 😉

Комментарии:

1. Вы разыменовываете указатель, как обычно?

2. Вы должны инициализировать i и j перед вызовом max .

3. Звездочки перед функцией не обязательно должны быть звездочками, когда функция возвращает указатель. Например, int **func(void) вернет указатель на указатель на int .

4. @MikeCAT Мы инициализируем и печатаем i? Разве тогда не бессмысленно использовать функцию max?

5. printf("%dn", *p);

Ответ №1:

Первый последний вопрос — max возвращает значение или a или b . Поскольку оба a и b имеют тип int * (указатель на int ), то возвращаемый тип max также должен быть int * .

Чтобы получить доступ к целочисленному значению, вам потребуется разыменовать результат max :

 int main()
{
    int *p, i, j;
    
    /**
     * The values of i and j are indeterminate at this point;
     * you need to assign valid values to them before calling
     * max.
     */
    i = some_value();
    j = some_other_value();

    p = max(amp;i, amp;j); 
    
    printf("%dn", *p);  // Dereference p here to print the int value

    return 0;
}
 

Другой способ взглянуть на это заключается в том, что выражения *a , *b , *p , и *max( amp;i, amp;j ) все имеют тип int .

Если вы хотите max вернуть an int , а не an int * , вам нужно будет разыменовать a и b в return операторах:

 int max( int *a, int *b )
{
   if ( *a > *b )
     return *a;
   else
     return *b;
}
 

Хотя…

Непонятно , почему вы передаете указатели в качестве аргументов max ; вы не пытаетесь изменить значения a или b , поэтому на самом деле нет необходимости использовать указатели вообще. Просто определите max как

 int max( int a, int b )
{
  if ( a > b )
    return a;

  return b;
}
 

и назовите это так

 int m = max( i, j );
 

или даже

 printf( "max( %d, %d ) = %dn", i, j, max( i, j ) );
 

Комментарии:

1. Спасибо! Какое объяснение!