Neden inceleyebilirsiniz operatörü ( * ), aynı zamanda bir işaretçi bildirmek için kullanılır?
Eğer bu uygun bir programlama soru ise emin değilim, ama beni rahatsız olan bir şey değil, ve eğer bir tek ben mi merak ediyorum.
Başlangıçta C öğrenirken , başvurular kavramını anladım, ama göstericiler aklımı karıştırmıştı. Neden, sorabilir miyim? Bir işaretçi bildirmek için.
Aşağıdakileri göz önünde bulundurun:
void foo(int* bar)
{
}
int main()
{
int x = 5;
int* y = NULL;
y = &x;
*y = 15;
foo(y);
}
Fonksiyonu foo(int*)
parametre olarak int
bir işaretçi alır. Sonra ilan y
int
işaretçi, ben pas y
foo
, ama ne zaman ilk öğrenme C I ilişkili *
sembolü ile kaldırma gibi düşündüm bir başvuru yapıldı int
gerekli olması geçti. Belli ki işe yaramıyor foo
, *y
geçirmek için çalışacağını söyledi.
Daha kolay bir işaretçi bildirmek için ayrı bir operatör var olmazdı? (veya kaldırma). Örneğin:
void test(int@ x)
{
}
CEVAP
The Development of the C Language Ritchie onun akıl açıklar nitekim Dennis:
En net (C ayıran ikinci yenilik bu yazın öncekilerden daha dolgun yapısı ve özellikle de onun. tanımlamalar sözdizimi... herhangi bir nesne verilen ifade yazın toplayan yeni bir nesne tanımlamak mümkün olmalıdır bir dizi, içine birkaç bir işlev verir, ya da bir işaretçi. ...bu. [Bu]bir yol beyan isimleri ifade sözdizimi bu yansıtma için sözdizimi hangi isimler genellikle görünür.Böylece
int i, *pi, **ppi;
bir tam sayı, bir tamsayı için işaretçi, bir ilan bir tamsayı için işaretçi işaretçi. Bu beyanlar sözdizimii, *pi, and **ppi
int
Bir tür verim tüm gözlem yansıtır bir ifade içinde kullanıldığında.Benzer şekilde,
int f(), *f(), (*f)();
ilan bir fonksiyon bir tamsayı, bir işlev için bir işaretçi geri göndermek bir fonksiyon bir tamsayı döndüren bir işaretçi tamsayı.int *api[10], (*pai)[10];
tamsayılar, ve bir işaretçi işaretçiler bir dizi ilan dizisi.Tüm bu davalar, bir Bildirgesi değişken bir olan bir ifade kullanımı benzer bildirgenin başında adını verdi.
Sözdizimi bir kaza algılanan karmaşıklığı katkıda bulunmuştur dil. Yönlendirme operatörü, C ile yazılmış*, sözdizimsel bir. BCPL ve B. Bu iyi çalışıyor gibi tekli önek operatör, basit ifadeler, ancak daha karmaşık durumlarda, parantez vardır ayrıştırma yönlendirmek için gerekli. Örneğin, ayırt etmek değeri çağıran bir işlev tarafından döndürülen aracılığıyla dolaylı bir işlev işaretçisi, bir kişi tarafından belirlenmiş
*fp() and (*pf)()
yazar sırasıyla. Bu tarz ifadelerde kullanılan aracılığıyla taşır isimleri ilan olabilir yani bildirimleri
int *fp(); int (*pf)();
Fazla süslü ama hala gerçekçi durumlarda, işleri daha da kötü duruma gelir:
int *(*pfp)();
bir fonksiyon işaretçisi bir tamsayı için bir işaretçi döndürmek.İki etki ortaya çıkar. En önemlisi, C anlatan yollar nispeten zengin bir kümesi vardır türleri (söyle, Pascal ile karşılaştırıldığında). Dil olarak beyan C—Algol örnek tanımlamak için 68 olarak anlamlı nesneler için aynı derecede zor nesnelerin kendilerini karmaşık olduğu için, sadece anlamak. Bir ikinci etkisi sözdizimi ayrıntıları borçludur. C tanımlamalar olmalı bir okuyun `içeri-dışarı' çok kavramak için zor olduğunu tarzı. Sethi [Sethi 81] iç içe geçmiş birçok gözlendi tanımlamalar ve ifadeler yönlendirme olursa daha kolay olur sonek operatörü olarak alınmış operatör yerine önek, ama o zamana kadar değiştirmek için çok geçti.
Neden aynı hat üzerinde anonim bir fon...
Neden GCC neredeyse aynı C kodu için t...
Neden '397' ReSharper GetHas...
Neden adresi null işaretçi için kullan...
Nasıl/nodejs ile ABONE redis YAYINLAMA...