2015-02-07 53 views
1

我在stackoverflow上找到了answer中的通用交換函數的以下聲明。宏和函數中sizeof之間的區別

#define swap(x,y) do \ 
{ unsigned char swap_temp[sizeof(x) == sizeof(y) ? (signed)sizeof(x) : -1]; \ 
    memcpy(swap_temp,&y,sizeof(x)); \ 
    memcpy(&y,&x,  sizeof(x)); \ 
    memcpy(&x,swap_temp,sizeof(x)); \ 
} while(0) 

但是,如果我們用C寫一個類似的功能不工作,我們需要在空隙的大小明確地傳遞*類型爲它工作。我知道這會發生,因爲宏將被調用的函數內部擴展,並且sizeof將起作用,因爲它將與變量x或y處於相同的範圍。我對麼?

如果我是。考慮以下情況。

void someComplexFunction(void* a, void* b){ 
swap(a,b); 
} 

這是正確的嗎?我試過了,它工作。爲什麼這個工作?

回答

1

你交換指針的地址而不是實際的內容。

這個代碼表示它

char *foo = "foo"; 
char *bar = "bar"; 

printf("before swap\n"); 
printf("foo address '%08x', foo content '%s'\n", foo, foo); 
printf("foo address '%08x', foo content '%s'\n", bar, bar); 

swap(foo, bar); 

printf("after swap\n"); 
printf("foo address '%08x', foo content '%s'\n", foo, foo); 
printf("foo address '%08x', foo content '%s'\n", bar, bar); 

輸出與此類似

before swap 
foo address '010e58a8', foo content 'foo' 
foo address '010e58ac', foo content 'bar' 
after swap 
foo address '010e58ac', foo content 'bar' 
foo address '010e58a8', foo content 'foo' 
+0

但是這僅僅是一個傳值。 – Sohaib 2015-02-07 19:15:52

+0

您正在傳遞指針,而不是值。在C/C++中,你總是可以操作指針 – esskar 2015-02-07 20:20:42

+0

哦,好的。得到它了! – Sohaib 2015-02-08 07:20:42

相關問題