2015-11-29 25 views
-2

該函數應該返回一個指針,指向數組中最大的int的第一次出現,而不使用索引操作符。它可以找到並打印最大的int,但是如何使它返回一個指針?我如何測試它是否成功?C - 如何使函數返回一個指針?

int *arr_first_max(const int *a, size_t n) { 
    const int *k; 
    int largest = 0; 
    for (k = a; *k != '\0'; k++) { 
     if (*k > largest) { 
      largest = *k; 
     } 
    } 
    printf("%d\n", largest); 
    return &largest; 
} 

編輯:size_t n應該被使用,但我不知道如何包括它。

+0

將最大更改爲'int *',而不是將值保留在數組中,而是將指針保留在數組中。 –

+0

你爲什麼要將int與char進行比較? '* k!='\ 0''可能就像這樣'for(k = a; * k; k ++)' – milevyo

+0

冗餘參數'size_t n' – manetsus

回答

-1

我不會猜測什麼size_t n

int *arr_first_max(int *a, size_t n) { 

    int *largest = a; 
    while(*a){ 
     a++; 
     if(*a>*largest) largest=a; 
    } 
    return largest; 
} 
+1

假設'a'是空終止的是沒有根據的。有一個大小參數傳遞的原因。 – StoryTeller

+1

我想知道'size_t n'是否是'a'數組的大小。以null結尾的int數組看起來很不可思議。也許他正在尋找的是'while(n - )'?繼續遍歷整個數組?誰知道 –

+0

@StoryTeller,我同意你的看法,但是問題中發佈的是什麼。我不知道 – milevyo

0

這工作。你檢測到最大的數字就像你一樣,然後再次運行相同的循環,看看數字在哪裏然後返回該地址。我還將一些數據類型從int更改爲const int,並且我刪除了第二個參數,因爲您正在檢查空字符。

#include <stdio.h> 
#include <stdlib.h> 

const int *arr_first_max(const int *a) { 
    const int *k; 
    int largest=0; 
    for (k = a; *k != '\0'; k++) { 
    if (*k > largest){ 
     largest = *k; 
    } 
    } 
    for (k = a; *k != '\0'; k++) { 
    if (*k == largest){ 
    return k; 
    } 
    } 
} 

int main(){ 
    int nums[6]={7,2,1,5,4,6}; 
    const int* y=arr_first_max(nums); 
    printf("%d\n", *y); 
} 
1

在所有功能n被假定爲>0

只是保持你的邏輯,但不是存儲最大值,而是將索引存儲到最大值,以便返回指向該索引處數組的指針。

int *arr_first_max(const int *a, size_t n) { 
    int i,l; 
    for (l=i=0 ; i<n ; i++) 
    if (a[i] > a[l]) l = i; 
    return a+l; 
} 

這確實n-1迭代

const int *arr_first_max(const int *a, size_t n) { 
    const int *most; 
    for (most=a++ ; --n ; a++) if (*a > *most) most = a; 
    return most; 
} 

而且因爲我誤解了問題,遞歸獎金編輯指針唯一版本(基於評論)!

const int *arr_first_max_r(const int *most, const int *a, size_t n) { 
    if (*a > *most) most = a; 
    return --n ? arr_first_max_r(most, ++a, n) : most; 
} 

被稱爲像這樣

printf("Biggest int is : %d\n", *arr_first_max_r(a, a, n)); 
+0

根據問題不允許使用下標運算符。 – Elyasin

+0

謝謝!更新了答案。 –

2

而另一個答案假設:

  1. n是陣列a的長度(以單元爲單位,而不是字節)
  2. 你想遍歷整個陣列a

然後代碼是:

const int *arr_first_max(const int *a, size_t n) { 
    const int *largest = a; 
    while(n--) { 
     if(*a>*largest) 
     largest = a; 
     a++; 
    } 
    printf("%d\n", *largest); 
    return largest; 
} 
+1

當然你的意思是「NULL」:) – StoryTeller

+0

@StoryTeller是的:P我最近在基於Java的環境中寫了太多:/ –

+1

我明白了爲什麼你想要一個理智檢查,比:) 我只是添加還有一件事。由於'size_t'是無符號的(實現定義的,但沒有簽名)。小於零的檢查是不必要的。 – StoryTeller

0

假設

  • 函數的簽名是正確和完整的(arr_first_max暗示您在用於第一最大元素的數組搜索)
  • 因此int* a是指向第一個元素的指針(即相當於簽名中的int a[]);我將離開const符在這種情況下,雖然我想你可以省略/丟棄,如果鍛鍊允許那些
  • size_t n是數組的大小,或者換句話說,數組中元素的個數
  • 要返回一個指針數組中的最大元素,而無需使用標[]操作

那麼這將是一個解決方案

int *arr_first_max(const int *a, size_t n) { 
    int *largest, *k; 
    for (largest = k = a; (k - a) < n; k++) 
     if (*k > *largest) 
      largest = k; 
    return largest; 
} 

這是因爲我從C編程語言引述如下:

指針減法也是有效的:如果pq指向的 相同的陣列元件,和p<q,然後q-p+1是元件從 p數到q(含)。