這一切都取決於:您是如何打印地址的?如果你得到變量的地址,那麼當然是它們會有所不同。指針指向的值,但是,將同一::
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
}
Ç總是經過值,在指針的情況下,該值是內存地址,在基本類型(int
,char
,long
...)的情況下,它不是變量但值你傳遞,如果你傳遞一個指針變量(&my_int
),你沒有傳遞變量,而是在內存中的地址。這些是你必須選擇的唯一兩個選項。
更多關於所述受檢者(陣列VS指針,以及爲什麼陣列衰變成指針在大多數情況下you may find this link useful)
你*做*在調用它們之前聲明函數?即在'mainFunction'中調用''之前你有'readFunction'的原型嗎? –
您是否在函數被調用的地方之前定義了函數原型?如果不嘗試將函數定義移到被調用的位置上方。如果修復它,那麼它不起作用的原因是因爲編譯器正在假設有關該函數的一些東西 - 並假設它不正確。 –
嚴格來說,C中不是'傳遞引用'。你如何輸出地址?當'readAddress'被'aAddress'調用時,'pAddress'是一個指針,它應該指向與'aAddress'相同的位置。 – Axel