簡體   English   中英

C - 按值傳遞並通過參考不一致傳遞

[英]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 總是按值傳遞,該值是一個內存地址,如果是基本類型( intcharlong ...),它不是變量而是你傳遞的 ,如果你傳遞一個指向變量( &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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM