#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. Спасибо! Какое объяснение!