2016-04-13 16 views
-3

私はこのプログラムで間違っていることを理解できません。私は配列の中で最大の値のアドレスを出力しようとしていますが、配列の最初の値のアドレスを取得し続けます。私はかなり問題が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

あなたの関数はポインタを返しています...なぜあなたは 'array [i]'添え字を使用していないのですか?関数宣言の戻り値の型。 – t0mm13b

+0

問題は私にポインタ算術と関数宣言の*を使用する必要があります –

+1

あなたの型指定子 '%d'は未定義の動作を呼び出します。正しいものを使ってポインタを印刷してください! – Olaf

答えて

2
ここ

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; 

編集を:コメントに指摘されているように、住所を表示するために間違った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; 
} 
関連する問題