2016-03-19 30 views
2

Anlamadığım şekilde işaretçilerin kullanıldığı yol arasında belirgin bir tutarsızlık var.Başvuruda/dereferencing C/C++ içinde

Aşağıdaki kod Pointers in C: when to use the ampersand and the asterisk? alınır:

void swap(int *x, int *y) {int tmp = *x; *x = *y; *y = tmp; } 
... 
int a = 1, b = 2; 
printf("before swap: a = %d, b = %d\n", a, b); 
swap(&a, &b); 
printf("after swap: a = %d, b = %d\n", a, b); 

Aşağıdaki kod https://en.wikipedia.org/wiki/Typedef alınır:

İlk durumda:

İşte
int do_math(float arg1, int arg2) { 
    return arg2; 
} 

int call_a_func(int (*call_this)(float, int)) { 
    int output = call_this(5.5, 7); 
    return output; 
} 

int final_result = call_a_func(&do_math); 

anlamıyorum ne Referans operatörünün etkisine karşı koymak için, dereferans operatörü x veile birlikte kullanılır., bu yüzden onları daha fazla ya da daha az kullanabilmeniz için onları referans olarak geçmemiş olsaydınız, bunları dereferencing olmadan kullanabildiniz, bunları * 'ler ile kullanabilirsiniz. Ancak ikinci durumda, call_this, referans tarafından geçirildiği gerçeğini ortadan kaldıran bir hata giderme işleci kullanılarak çağrılmaz; yani (*call_this)(5.5, 7) olarak adlandırılmaz.

* 'nu neden referans olarak iletme etkisini tersine çevirmek için kullanabildiniz, böylece olayı, değişkenler söz konusu olduğunda normalde yaptığınız gibi daha fazla veya daha az kullanabilirsiniz;

+1

C referanslar, sadece işaretçileri desteklemez. C++ farklı bir dildir. Ve bir "referencing operatörü", C. – Olaf

+1

'da mevcut değildir. "Karşılıklılık" ifadesini kullanımınızı çok kafa karıştırıcı buluyorum. Burada hiçbir şeyle mücadele yok. [Bu liste] 'deki kitaplardan (http://stackoverflow.com/q/388242/2069064) yararlanmanızı ve işaretçilerin hangisinin daha iyi olduğunu anlamanızı öneririz. – Barry

+0

Sanırım kelime karşıtlığını kullanmam biraz kafa karıştırıcıydı. Ben sadece referans olarak bir değer iletirseniz, normalde kullanmak için onu ayırmak zorunda kalacaksınız, bu yüzden ikisi birbirini tamamlar. – inhahe

cevap

2

Sen fonksiyonları yanı sıra işlev işaretçileri çağırabilir:

void (*a)(); 
void (b)(); 

// Both valid 
a(); 
b(); 
+0

teşekkürler, bu, (* call_this) (5.5, 7) 'nin yukarıdaki kodda eşit derecede iyi çalıştığı anlamına mı geliyor? – inhahe

+0

@inhahe: evet, öyle – Dani

İlgili konular