2016-04-13 16 views
-3

Bu programda neyi yanlış yaptığımı anlayamıyorum. Bir dizideki en büyük değerin adresini yazdırmaya çalışıyorum ama dizideki ilk değerin adresini almaya devam ediyorum. Problemin for döngüsünde olduğundan eminim ama tam olarak nerede olduğunu anlayamıyorum. İşte kod: Buradaİşaretçiler ve İşlev Çağrısı

#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

İşleviniz neden 'dizi kullanmıyorsanız ... bir işaretçi döndürüyor [i]' Altsimgeleme, daha kolay ilk anlamak yapmak ve bırakmak için '*' dan işlev bildiriminin dönüş türü. – t0mm13b

+0

Sorun, –

+1

işlev bildiriminde işaretçi aritmetiğini ve * işlevini kullanmamı gerektirir. Tür belirteciniz '% d', tanımlanmamış davranışları çağırır. Bir işaretçi basmak için doğru olanı kullanın! – Olaf

cevap

2

İki sorun:

  1. Sen (bir göstericinin takibi değil) ve daha sonra sadece orijinal işaretçi dönen dizinin kendisinde değerleri değiştiriyorsunuz.
  2. Döngüsünüz geriye doğru ve asla çalışmaz (0 başlangıç ​​değerine sahip i++ sonlandırma koşulu false olarak değerlendirilecektir).

Bunun yerine, bir başka pointer izlemek ve böyle yapmak: Eğer tamamen işaretçi aritmetik çözüm üzerinde ısrar ederse

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

, şunu deneyin:

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

Edit: Açıklamalarda belirtildiği gibi, bir adresi görüntülemek için yanlış printf belirtecine de sahipsiniz. Bunun yerine %p kullanın: Elbette

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

, bunu iade ardından dizinin ilk elemanını değiştiriyorsa büyük fonksiyonunda yaptığını ve ne. *array'u değiştiriyorsunuz, ancak sizin geri dönüşünüz olan array'u değiştirmiyorsunuz.

-1

İlk sorun, döngü tanımı için 'unuzdadır. Böyle olması gerekir: için

(i = 0; i < boyutu; i ++)

ikinci sorun, dizinizi değiştirerek olmasıdır. onun yerine bu kod parçacığını kullanın:

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; 
}