2016-04-13 5 views
-3

Я не могу понять, что я делаю неправильно с этой программой. Im пытается распечатать адрес наибольшего значения в массиве, но я продолжаю получать адрес первого значения в массиве. Я уверен, что проблема в цикле for, но я не могу понять, где именно. Heres код:Указатели и функциональные вызовы

#include <stdio.h> 

int *Largest(int *array, int size); 


int main (void) 
{ 
    int* Z; 
    int A[10] = {3,53,52,6,2,8,3,6454,232,88}; 
    Z = Largest(A, 10); 


    printf("The address of the largest Value is: %d", Z); 

} 

int* Largest(int *array, int size) 
{ 
    int i; 
    for (i=0; i++; i<size) 
    { 
     if (*(array+i) > *array) 
     *array = *(array+i); 
    } 
    return array; 
} 
+0

Ваша функция возвращает указатель ... Почему вы не используете 'массив [я]' индексирование, чтобы сделать его легче понять первое, и опускать '*' из возвращаемый тип объявления функции. – t0mm13b

+0

проблема требует, чтобы я использовал арифметику указателя и * в объявлении функции –

+1

Спецификатор типа '% d' вызывает неопределенное поведение. Используйте правильный, чтобы напечатать указатель! – Olaf

ответ

2

две проблемы:

  1. Вы изменяете значения в самом массиве (не отслеживанием указатель), а затем просто возвращается исходный указатель.
  2. Ваш цикл обратный и никогда не выполняется (поскольку условие завершения i++ с начальным значением 0 будет равно false).

Вместо отслеживать в другой указатель и сделать это следующим образом:

int i; 
int *largest = array; 
for(i = 1; i < size; ++i) 
{ 
    if(array[i] > *largest) largest = &array[i]; 
} 
return largest; 

Если вы настаиваете на чисто указателю арифметического решения, попробуйте следующее:

int *end = array + size; 
int *largest = array; 
for(; array != end; ++array) 
{ 
    if(*array > *largest) largest = array; 
} 
return largest; 

Edit: Как указано в комментариях, у вас также есть неправильный спецификатор printf для отображения адреса. Используйте %p вместо:

printf("The largest Value is: %d", *Z); 
printf("The address of the largest Value is: %p", Z); 
-1

Конечно, то, что вы делаете в крупнейшей функции модификации первого элемента массива, а затем вернуть его. Вы изменяете *array, но не array, который является вашим возвращением.

-1

Первая проблема в вашем для определения цикла. Должно быть так:

для (I = 0; я < размер, я ++)

Вторая проблема заключается в том, что вы изменяете ваш массив. Используйте этот фрагмент кода вместо:

int* Largest(int *array, int size) 
{ 
    int* largest_ptr = array; 
    int i; 
    for (i = 1; i < size; i++) 
    { 
     if (array[i] > array[i - 1]) 
     { 
      largest_ptr = array + i; 
     } 
    } 
    return largest_ptr; 
} 
Смежные вопросы