2017-03-21 71 views
1

我瞭解,爲了通過調用一個函數來訪問或修改變量的值,我們需要傳遞指針作爲參數,如下面:返回值或傳遞指針作爲參數?

#include <stdio.h> 

//create a function 
void Increment(int* x) {  
    *x = *x+1; 
    printf("Address of variable x in increment = %p\n",x); 

} 

int main() { 
    int a; 
    a = 10; 
    Increment(&a); 
    printf("Address of variable 'a' in main = %p\n",&a); 
    printf("Value of a in main function = %d\n",a); 


} 

但我做了另一個試驗,我發現,通過調用函數並返回值,我也可以達到相同的結果。

#include <stdio.h> 

//create a function 
int Increment(int x) {  // do not use VOID 
    x = x+1; 
    printf("Address of variable x in increment = %p\n",x); 
    return x;     

} 

int main() { 
    int a; 
    a = 10; 
     int hasil; 
     hasil = Increment(a); 
    printf("Address of variable 'a' in main = %p\n",&a); 
    printf("Value of a in main function = %d\n",hasil); 


} 

我的問題:

1)我要通過指針,如果我可以只使用返回值來達到相同的結果的說法?

2)我發現,當我從返回值的函數印刷可變「x」的內存地址,內存地址是很短0XB,任何想法,爲什麼?通常地址很長。

+0

如果您想修改多個變量,該怎麼辦? (他們也不完全一樣 - 第二個版本複製變量的值) – UnholySheep

+0

返回函數結果意味着您可以在表達式中使用它;表達式中不能使用void函數。 –

回答

1

1)如果我只能使用返回值來獲得相同的結果,我是否必須傳遞指針作爲參數?

不,你並不總是有來。但要注意的是,它釋放了錯誤報告功能的返回值。一個很簡單的例子:

enum error_code { 
    E_SUCCESS, 
    E_GENERAL_FAILURE, 
    E_MEMORY_ALLOCATION_FAILED, 
    E_INVALID_ARGUMENT, 
    E_FILE_NOT_EXIST 
}; 

struct my_important_data { 
    // stuff 
}; 

enum error_code fill_important_data_from_file(char const *file_name, 
               struct my_important_data **data) 
{ 
    if(!data || !file_name) 
    return E_INVALID_ARGUMENT; 

    *data = malloc(sizeof(**data)); 

    if(!*data) 
    return E_MEMORY_ALLOCATION_FAILED; 

    // Return different error codes based on type of failure 
    // so the caller can know what exactly went wrong 

    return E_SUCCESS; 
} 

2)我發現,當我從返回值的函數打印變量「x」的內存地址,內存地址是很短0XB,任何想法,爲什麼?通常地址很長。

這是因爲您正在使用%p轉換說明符來打印常規int而不是實際地址。嚴格來說,這導致printf函數具有未定義的行爲。

+0

您能否進一步解釋'釋放錯誤報告函數的返回值'是什麼意思?而關於%p,我應該用什麼來打印實際的地址? –

+0

@LionGordon在C語言中,返回值通常用於狀態/錯誤代碼,因爲沒有例外。所以,這取決於你的API設計,你想如何處理你的回報價值。 –

+0

@LionGordon - 你可以通過將地址'(void *)&x'打印出'x'的地址。至於示例,請參閱我的修訂後的帖子。 – StoryTeller

-1

當您需要修改數組的元素時,您需要將指針傳遞給函數。在C中,您不能傳遞數組或從函數返回數組。

你的第二個問題的答案是,在C函數參數是通過值傳遞。這意味着傳遞參數的值被複制到函數的參數(對函數來說是本地的)。因此傳遞參數的地址和函數參數的地址是不同的。

+0

不要修改數組的元素,因爲無論如何數組都是通過引用傳遞的。 –

+0

@PaulOgilvie; C僅支持按值傳遞。沒有通過參考。 – haccks

+0

是的,Haccks,這意味着編譯器「按值」傳遞數組的地址,結果是數組「通過引用傳遞」。你需要傳遞一個指向數組的指針。 'int * A; ... f(&A){* A = realloc(..' –

-1

如果通過點或引用傳遞參數x,則不會創建x的值副本。 如果沒有,則創建一個副本。這是不同的。
想想這種情況下,如果該參數是一個複雜的struct test,這是浪費時間,以使test副本。
如果按點通過x,則可以將其用作輸入,也可以用作輸出。

+1

請讓你的解決方案更加清楚;這樣做有點難以理解 –

+0

@Charles我明白,但我問爲什麼我應該使用指針,如果我可以通過使用返回值實現相同的結果 –

相關問題