2014-02-20 70 views
0

我有這樣的功能:通過參數2時將整數指針,未作鑄造

int second(int x,int c[100]) 
{ 
    int b,e=0; 
    for(b=0;b<x;b++) 
     { 
     if(c[b]!=(65||117)) 
     e++; 
     } 
     return (e); 
} 

此循環將檢查如何在一個陣列許多數不相等
到65或117和值被遞增是爲了計算有多少數字是這些數字,這個數值將被返回到主函數。

現在我想在主函數中使用返回的值。 這裏是語法我使用:

h=second(x,c[100]); 

我收到此錯誤:

"passing argument 2 of second makes pointer from integer without a cast" 

如何使函數返回該值?

+1

請使用正確的格式發佈您的問題。 – Soumen

+0

想一想'(c [b]!=(65 || 117))'可能會產生什麼結果。特別是評估它的順序。你比較'c [b]'和'(65 || 117)'的值。我相信你不想那樣。 – glglgl

+0

「這個循環將檢查一個數組中有多少個數不等於 到65或117」 - 不,它不會。這不是'''的工作方式。 – unwind

回答

2

你想

h=second(x,c); 

你現在正在做的是試圖將元素在指數100,這是不好的通過。你想傳遞數組。

1

您正在傳遞數組錯誤的方式。
你應該做的是:h=second(x,c);

function(int a , int array[])意味着2nd argument是陣列的base address
對於數組,基地址實際上是數組的名稱。

例如陣列的基址[100]array

1

你的呼叫是錯誤的,它不應該包括括號。只要做到:

h = second(x, c); 

此外,雖然

if(c[b]!=(65||117)) 

可能在英語閱讀權,它不是C是如何工作的。

它必須是

if(c[b] == 65 || c[b] == 117) 

||運營商分離的整個表達式,不只是左側的替代品。

+0

@EricPostpischil確實如此。謝謝。 – unwind

4

爲了解發生了什麼,需要了解以下幾點。

int second(int x,int c[100]),參數c的聲明作爲陣列100 int被自動轉換爲聲明c作爲指針int。數組的這種特殊處理總是應用於函數參數。 (它不適用於參數的子部分,例如,指向數組的指針不會轉換爲指向指針的指針。)

在程序稍後的某個地方,您可能有一條線路,如int c[100];。該行的確聲明c是100 int的數組。

h=second(x,c[100]);中,表達c[100]是指陣列c的元件100。因此,這個表達式是單個的int。您不應將int傳遞給函數,因爲它期望指向int的指針。你可能想要傳遞一個指向數組的第一個元素的指針。 C的語法是&c[0]。 C提供了一些幫助,讓你縮寫爲c。如果您編寫h = second(x, c);,則c將自動從數組轉換爲指向其第一個元素的指針。

這種自動轉換髮生時的表達(包括任何子表達式)是一個數組,不是sizeof操作數,一元的&,或_Alignof並且不是用於初始化數組文本的字符串。

此外,if(c[b]!=(65||117))不測試c[b]是否不等於65或117.要執行此測試,您應該使用if (c[b] != 65 && c[b] != 117)。你寫的方式,65||117是一個表達意思true if either 65 or 117 is true。出於這些目的,非零值爲真,因此65||117爲真。也爲了這些目的,true成爲整數1(並且假將爲0)。因此,這個測試是if (c[b] != 1),這不是你想要的。