2014-01-28 47 views
1

當使用通在C基準,有時傳遞到被調用函數的地址發生變化:Ç - 按值傳遞和引用傳遞不一致

void mainFunction() 
{ 
    BYTE aAddress[10]; 
    readFunction(aAddress); // Address of aAddress: 0x111111 
} 

void readFunction(BYTE *pAddress) // Address of pAddress: 0x222222 
{ 
    ... 
} 

我遇到過,使用按值傳遞時的另一個問題,被調用函數接收到的值與傳遞給它的值不同。

void mainFunction() 
{ 
    readFunction(0x20); // Passed value: 0x20 
} 

void readFunction(BYTE uValue) // Received value: 0x00 
{ 
    ... 
} 
+0

你*做*在調用它們之前聲明函數?即在'mainFunction'中調用''之前你有'readFunction'的原型嗎? –

+0

您是否在函數被調用的地方之前定義了函數原型?如果不嘗試將函數定義移到被調用的位置上方。如果修復它,那麼它不起作用的原因是因爲編譯器正在假設有關該函數的一些東西 - 並假設它不正確。 –

+4

嚴格來說,C中不是'傳遞引用'。你如何輸出地址?當'readAddress'被'aAddress'調用時,'pAddress'是一個指針,它應該指向與'aAddress'相同的位置。 – Axel

回答

2

這一切都取決於:您是如何打印地址的?如果你得到變量的地址,那麼當然是它們會有所不同。指針指向的值,但是,將同一::

int main (void) 
{ 
    char some_array[100]; 
    printf("array holds: %p\n", (void*) some_array);//same 
    printf("Address in main: %p\n", (void*) &some_array[0]);//same 
    pass_arr(some_array); 
    return 0; 
} 
void pass_arr(char *arr) 
{ 
    printf("Address of pointer VAR: %p\n", (void *) &arr);//PRINTS DIFFERENT ADDRESS 
    printf("Pointer address: %p\n", (void *) arr);//same 
    printf("points to: %p\n", (void *) &(*arr));//same 
} 

check this codepad
你可能無法正確打印變量的地址,只方式是使用%p佔位符,並將的地址投給void *。這是由於地址打印出來的方式取決於實現。


這就是說,你提 「按引用傳遞」。 C沒有通過引用傳遞,它沒有C++意義上的引用。但是,爲了使功能改變的別的東西的價值,你應該傳遞指針的指針:

struct some_str 
{ 
    int mem1; 
    size_t mem2; 
}; 
int main (void) 
{ 
    struct some_str *foo = malloc(sizeof *foo); 
    set_value(&foo); 
    free(foo); 
    return 0; 
} 
void set_value(struct some_str **change) 
{//pointer to pointer 
    static int change_count = 0; 
    (*change)->mem1 = 123; 
    (*change)->mem2 = ++change_count;//for example 
} 

Ç總是經過值,在指針的情況下,該值是內存地址,在基本類型(intcharlong ...)的情況下,它不是變量你傳遞,如果你傳遞一個指針變量(&my_int),你沒有傳遞變量,而是在內存中的地址。這些是你必須選擇的唯一兩個選項。

更多關於所述受檢者(陣列VS指針,以及爲什麼陣列衰變成指針在大多數情況下you may find this link useful

+0

優秀的答案。 – George

+0

我要補充的一件事是C只有通過價值傳遞指針是一種形式;通過參考是不同的。 –

+0

@JimBalter:將其添加到我的答案中。 PS:也許改變你的評論到_「99%的次數是你的錯誤,並且操作中唯一的工具就是你」__ :) –

1

當使用通通過在C基準,有時傳遞到被調用函數的地址改變

- > NO。看看這段代碼

#include <stdio.h> 

void readFunction (int *pAddress) 
{ 
    printf("Address of pAddress: %p\n", &pAddress); 
    printf("Content of pAddress: %p\n", pAddress); 
} 

void main() 
{ 
    int a[10]; 
    printf("Address of a: %p\n", &a); 
    readFunction(a); 
} 

時執行它,你會得到的東西如:

Address of a: 0xbfb94948 
Address of pAddress: 0xbfb94930 
Content of pAddress: 0xbfb94948 

pAddress位於另一個地方,但它仍然指向的a地址。這是通過引用傳遞的基元

+0

投射你的指針,並解釋_「這是通過引用傳遞的原語」_ –

+0

C語言不支持「通過引用傳遞」。完全一樣。你可以得到的最接近的是_value_傳遞_pointer_。有些人堅持認爲這是「通過參考」,但這是不正確的。 –

+0

當傳遞一個指向'printf()'的指針以使用'%p'轉換來打印時,指針必須總是被轉換爲'(void *)'。 –