2017-06-04 28 views
-4

我知道這是一個很多人以前問過的話題,但我仍然對將一個數組作爲參數傳遞給一個函數感到困惑。我想知道 這段代碼在這裏發生了什麼,以及爲什麼當我嘗試獲取數組sizeof時它工作正常。爲什麼將int(* p)[4]作爲參數傳遞來獲取函數內數組的大小?

#include <iostream> 


void function(int* parray, int(*array)[4]) //-> i dont get it 
{ 


    int size = sizeof(*array)/sizeof(*parray); 

    std::cout << &parray << std::endl; 
    std::cout << *parray << std::endl; 
    std::cout << *array << std::endl; 
} 

int main(){ 

    int array[4]= {2,3,5,4}; 

    function(array,&array); 


    return 0; 
} 
+0

因爲C++語言表示它。你問這是爲什麼嗎? – juanchopanza

+2

*爲什麼它能正常工作,當我嘗試獲取數組的大小時*你在哪裏做? – Borgleader

+1

你*不是*'將它作爲參數傳遞'。你*聲明*它爲*參數。* – EJP

回答

-2

的T類型的數組是T (*)[N],但一個簡單的指針T*是不同的,我一個指針不說這是多少個項目指向了。

因此,我們有:

int a[4]; 
a; // type of a is "int (*)[4]" 
&a; // the compiler doesn't change the type it's still "int (*)[4] 
&a[0]; // it's now "int *" 
+0

@Yunnosch這是C++語法,OP在他的例子中使用iostream,所以這是一個C++問題! – amin

+1

@Yunnosch這個語法也存在於C中,但它意味着'指向T'的數組(大小爲N)的指針,而不是'T'的數組(大小N)。 – HolyBlackCat

+1

只要提及,downvote不是由我,我剛剛混淆的語法。感謝您的解釋,如果將其編輯,可能會提高答案。 – Yunnosch

1

我會盡量解釋它,即使我的C++的技能是有點有點生疏。

void function(int* parray,int(*array)[4]) 

這是你的函數聲明,你基本上有一個函數,它的指針int作爲第一個參數,一個指向4整數作​​爲第二個參數的數組。

數組在C/C++中是特殊的,因爲它們不是指針。好吧,也許一點。

你有什麼,只要你將變量聲明爲

int* p 

你告訴這將是在那裏可以找到方向的存儲器保持一個整數空間的地方編譯器。由於指針算法存在,其他整數可能存在於p+1p+2等等,編譯器不知道。

另一方面,當您使用

int a[SIZE] 

你告訴這將是SIZE整數數組和你要參考使用名稱a數組的編譯器。由於它並不真正知道數組是什麼,它只是分配足夠的空間來擁有SIZE*sizeof(int)字節,並使用a作爲指向該空間的指針。

關鍵區別在於編譯器知道什麼。 在第一種情況下,什麼都沒有。在第二種情況下,它知道引用指針它會找到足夠的空間來容納4個整數。

1

因爲標準中沒有任何東西阻止它的工作。


當你聲明與T [N]型或T []一個參數,它實際上變成T *

因此,當您使用普通數組作爲參數時,任何大小的信息都會丟失。沒有辦法從T *得到N

但是int (*param)[N]不是數組。這是一個指針。它是否指向一個數組並不重要;只要param本身不是數組,其類型不會被修改。

相關問題