2014-10-08 223 views
-1

我正在嘗試編寫一個程序,該程序將:該函數返回一個指向double值數組的最大值的指針。如果size爲0,則返回特殊指針值NULL(或0)。C++返回指針

我不確定我的邏輯是否正確,或者函數是返回一個地址還是temp的值。

const double * pMax(const double a[], size_t size){ 

    double * ptr; 

    for(size_t i = 0; i < size; i++){ 
     if(a[i] > a[i+1]){ 
      ptr = a[i]; 
      } 
     }  
    return ptr; 
} 

錯誤:不能轉換 'const的雙' 到 '雙*' 在分配 PTR = A [1];

+8

永遠不會返回指向局部變量的指針。 – 2014-10-08 02:47:05

+0

這裏是一個類似函數的參考實現http://www.cplusplus.com/reference/algorithm/max_element/ – 2014-10-08 02:48:10

+1

我不確定你的代碼的任何一行是否正確。您沒有找到最大值,返回一個指向它的指針,或者在大小爲0時返回NULL。 – stark 2014-10-08 02:57:07

回答

3

擺脫temp變量:你永遠不應該返回一個指向函數內的局部變量的指針,因爲當調用者接收到返回的指針時,它指向的變量超出了範圍。相反,你應該返回一個指向a數組中其中一個元素的指針。

算法概述使用:

  • 初始化ptrNULL。這是默認值,直到通過檢查數組中的至少一個數字來更改它爲止。
  • 用循環遍歷數組。 (如果數組爲空,即size爲0時,環將運行零次。)
  • 通過每一次循環中,如果ptrNULL它指向(即*ptr)小於所述值當前數組元素,請將ptr更改爲指向當前數組元素。這將使它指向最初的第一個值,然後將其修改爲指向不同的元素,只要找到更大的元素。
  • 循環結束時,ptr指向循環找到的數組中最大的元素。如果循環沒有運行任何迭代(因爲size爲0),ptr仍然是NULL。無論哪種方式,這是你想要的結果,所以返回它。
+0

我試着做你說的,但知道'不能'const double'轉換爲'double *' ptr = a [i];' – Hidden 2014-10-08 03:07:40

+0

@Hidden然後讓ptr成爲'const double *',你需要'a [i]'的地址' – 2014-10-08 03:08:16

+0

在程序片段中,如果數組中的最後一個元素是最大的,那麼它不會計算指向它的指針。因爲,當循環在i ==(size-1)處結束時,[i + 1]會導致數組索引超出界限,冒險 – 2014-10-08 03:20:02

0

您需要將ptr初始化爲NULL,以便在數組中不包含任何元素時處理這種情況。對於所有其他情況,它遍歷數組,找出指向max元素的指針並返回該指針。另外,在程序片段中,如果數組中的最後一個元素是最大的,它不會計算指向它的指針。因爲,當循環在i ==(size-1)處結束時,[i + 1]會導致數組索引超出範圍,存在風險。以下是更正後的版本:

const double * pMax(const double a[], size_t size){ 
const double * ptr = (size == 0) ? NULL : &a[0]; 
for(size_t i = 1; i < size -1; i++){ 
    if (a[i] > *ptr){ 
    ptr = &a[i]; 
    } 
}  
return ptr; 
}