Nasıl yeni başlayanlar için C işaretçileri (tekli işleçler bildirimi vs.) açıklamak için?
C programlama bir acemi için işaretçiler açıklamak için son zevk oldu ve şu zorluk sendeledi. Eğer zaten işaretçileri kullanmak için nasıl biliyorsanız bir sorun gibi görünmeyebilir, ama açık bir zihin ile örnek: aşağıdaki bakmaya çalışıyorum
int foo = 1;
int *bar = &foo;
printf("%p\n", (void *)&foo);
printf("%i\n", *bar);
Mutlak yeni başlayanlar için çıktı şaşırtıcı olabilir. Hat 2 *bar &foo ilan etmişti, ama hat 4 *bar aslında yerine foo ve foo olduğu ortaya çıktı!
2 bir işaretçi bildirmek için kullanılır satır. karışıklık,, * sembol belirsizlik kaynaklanıyor diyebilirsiniz: 4 satır işaretçisi puan değeri getirir olan tekli bir operatör olarak kullanılır. İkisi farklı şeyler, değil mi?
"Açıklama" acemi bir faydası yok. Bu ancak, İnce bir tutarsızlık işaret ederek yeni bir konsept tanıttı. Bu öğretmek için doğru yolu olamaz.
Nasıl açıklama satırı yazmak ve Ritchie bunu açıklayabilir mi?
Tekli operatör * yönlendirme veya kaldırma operatör, işaretçi uygulandığında, işaretçinin işaret ettiği nesne erişir. [...]
İşaretçi ıp Bildirgesi,
int *ip
anımsatıcı olarak tasarlanmıştır; 6 ** ifadesi bir tamsayı olduğunu söylüyor.Bir değişken bildirimi sözdizimi, değişken görünebilir ifade sözdizimi taklit eder.
int *ip
gibi okunmalıdır "*ip
int
bir dönüş olacak"? Ama o zaman neden ilan edildikten sonra atama bu modeli takip etmiyor mu? Eğer bir acemi değişkeni başlatmak isterse ne olacak? int *ip = 1
(okuma: 11* *int
int
1
) bir döner beklendiği gibi çalışmaz. Kavramsal model sadece tutarlı görünmüyor. Bir şey mi kaçırıyorum?
Düzenleme:27* *için çalıştı.
CEVAP
Kestirme nedeni:
int *bar = &foo;
kolay eşdeğer olarak yanlış anladım . bu örnekte kafa karıştırıcı olabilir
int *bar;
*bar = &foo; // error: use of uninitialized pointer bar!
o zamanaslındaanlamı:
int *bar;
bar = &foo;
Değişken bildirimi ile bu şekilde yazılmış, ve ayrılmış atama, karışıklık ve kullan &Harry için böyle potansiyel yok; beyan paralellik K&R teklif anlatılan mükemmel çalışıyor:
İlk satırı bir değişken
bar
,*bar
int
böyle beyan eder.İkinci satır
foo
(int
*bar
bar
, (int
) takma adfoo
adresini atar.
Ne zaman tanıtımı C işaretçi sözdizimi için yeni başlayanlar yardımcı olabilir başlangıçta sopa bu tarz ayıran işaretçi tanımlamalar atamaları ve sadece tanıtmak kombine steno sözdizimi (ile gerekli uyarılar ilgili potansiyel karışıklığa) bir kez temel kavramlar işaretçi kullanın C olması, yeterince içselleştirilmiş.
Nasıl Mono ile başlamak için yeni başl...
Nasıl bir karakter yerine Vim bir yeni...
Nasıl baskı yeni satır veya boşluk olm...
Java nasıl yeni bir Liste yapmak için...
Nasıl github üzerinde mevcut bir sorun...