[英]C - Pass By Value and Pass By Reference Inconsistency
在C中使用pass by reference時,有時傳遞給被調用函數的地址會發生變化:
void mainFunction()
{
BYTE aAddress[10];
readFunction(aAddress); // Address of aAddress: 0x111111
}
void readFunction(BYTE *pAddress) // Address of pAddress: 0x222222
{
...
}
我遇到的另一個問題是,當使用pass by value時,被調用函數接收的值與傳遞給它的值不同。
void mainFunction()
{
readFunction(0x20); // Passed value: 0x20
}
void readFunction(BYTE uValue) // Received value: 0x00
{
...
}
這完全取決於:你是如何打印地址的? 如果你得到變量的地址,那么它們當然會有所不同。 然而,指針指向的值將是相同的::
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
}
檢查這個鍵盤
您可能無法正確打印變量的地址, 唯一正確的方法是使用%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
}
對於指針,C 總是按值傳遞,該值是一個內存地址,如果是基本類型( int
, char
, long
...),它不是變量而是你傳遞的值 ,如果你傳遞一個指向變量( &my_int
)的指針,你不是傳遞變量,而是傳遞它在內存中的地址。 這是您必須選擇的唯一兩個選項。
有關該主題的更多信息(數組與指針,以及為什么數組在大多數情況下會衰減為指針, 您可能會發現此鏈接很有用 )
在C中使用傳遞引用時,有時傳遞給被調用函數的地址會發生變化
- >沒有。 看看這段代碼
#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
的地址。 這是通過引用傳遞的原始
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.