2013-04-13 58 views
0

我真的對這個程序感到茫然。我希望它返回一個5個元素的整數數組的地址。但它只是不會'工作。如何使一個C函數返回一個數組的地址而不是地址它的第一個元素(基地址)?我知道兩者在數字上是相同的,但它們的類型不同,這就是爲什麼我問。在C中,如何讓這個程序返回一個數組的地址,而不是第一個元素的地址?

還要說得很清楚,如何聲明這些函數的原型?我理解如何聲明原型的參數部分(使用抽象聲明),但不知道如何聲明返回類型返回數組或函數的地址。我只知道,如果我們在函數名稱之前在聲明中放置一個'*',這意味着該函數返回一個指向相應主數據類型(如int,char或float)的指針。

#include<stdio.h> 

    int (*)[5]fun(int (*)[5]); 

    int main(void) 
    { 

    int arr[5]; 

    printf("%u",fun(&arr)); 

    } 

    int (*)[5]fun(int (*arr_add)[5]) 
    { 
    return arr_add; 
    } 

HELLO !!DANIEL FISCHER謝謝你的回答。你的回答確切而且簡潔。但我選擇了H2CO3的答案,因爲那個輝煌的匈牙利孩子不厭其煩地通過聊天向我解釋這個問題。很多聰明人在回答時很難挑出最好的答案。謝謝大家!

+0

我相信,(*)[5]之前在聲明函數名稱是完全荒謬的。我可以聞到它。但是如果我們想要提到該函數將返回除int,char或float之外的簡單指針以外的其他東西,我們究竟該怎麼做?我們如何表示它要返回一個數組的地址或函數的地址? –

+0

不是「&array_name」和「array_name」在類型上有所不同嗎?因爲「&array_name + 1」和「array_name + 1」肯定不同於以前按數組大小遞增的數據,而後者按一個元素的大小遞增。 –

+0

是的,它們是不同的。一個是'int [5]',它可以衰減到'int *',另一個是'int(*)[5]'。 – 2013-04-13 08:27:40

回答

1

給你:

int (*fun(int (*arr)[5]))[5] 
{ 
    return arr; 
} 

如果你想要回第一個元素(而不是數組本身的地址)的地址,這是一個不同的類型:

int *fun(int (*arr)[5]) 
{ 
    return &(*arr)[0]; 
} 
+0

但是你正在返回一個指針在「return&(* arr)[0]中的地址!! –

+0

@SheerFish編號'arr'是一個指向數組5'int'的指針,所以'* arr'是一個數組因此,'(* arr)[0]'是5'int'數組的第一個元素,'&(* arr)[0]'是該元素的地址,當從一個函數返回時,會衰減到'int *'。請不要教我C. – 2013-04-13 08:38:41

+0

我的不好!!我完全錯過了這一點。但是,先生,要說得很清楚,我們不能在函數聲明中明確聲明函數返回數組本身的地址(類型爲int(*)[])而不是數組的第一個元素的地址(類型爲int *)? –

1

這是錯誤的:

printf("%u",fun(&arr)); 

它應該是:

printf("%p", (void*)fun(&arr)); 

對於數組的地址,這將是同作爲其第一個元素的地址。現在

,聲明和定義應該真正的樣子:

int (*fun(int(*)[5]))[5]; 

固定碼:

#include<stdio.h> 

int (*fun(int (*)[5]))[5]; 

int main(void) 
{ 
    int arr[5]; 

    printf("%p\n", (void*)fun(&arr)); 
} 

int (*fun(int (*arr_add)[5]))[5] 
{ 
    return arr_add; 
} 

ideone

+0

但是不是「&arr」和「arr」不同,因爲它們有不同的類型? +1和&arr + 1肯定意味着不同的事情。一個增加一個元素的大小,而另一個增加數組的大小。 –

+0

@SheerFish是的,正好。類型不同,值相同。 – 2013-04-13 08:26:55

+0

我已更新/更正答案。 '&arr'和'arr'的類型是不同的,但是指針值是相同的。 –

3

這也許可以解釋它是如何工作是有些用處。

C的聲明語法背後的想法是「聲明模仿使用」。所以,你要

  • 功能

    fun() 
    
  • 採用指針到五int

    fun(int (*arr)[5]) // or without argument name fun(int(*)[5]) 
    
  • 數組並返回一個指針

    (*fun(int (*arr)[5])) 
    
  • 到五

    (*fun(int (*arr)[5]))[5] 
    
  • int

    int (*fun(int (*arr)[5]))[5]; 
    

或者,您也可以從結果去一個數組,這應該是一個指針五int陣列,

int (*result)[5]; 

和替代result與第其類型E調用(result = fun(arr)

int (*fur(arr))[5]; 

,然後添加參數的類型/替換參數:

int (*fun(int(*)[5]))[5]; 
+1

+1,很好解釋。 – 2013-04-13 09:34:02

相關問題