int * i; veya int * i; veya int * i; [kapalı]


30

İşaretçi bildirmek için en sevdiğiniz yöntem nedir?

int* i;

veya

int *i;

veya

int * i;

veya

int*i;

Lütfen nedenini açıklayın.

ayrıca bakınız: http://www.stroustrup.com/bs_faq2.html#whitespace


19
Diğerlerine 3000 satır daha odaklanmayı tercih ederim ...

29
int*i;- boşluklar ağaçlarda yetişmiyor, biliyorsunuz ...
Shog9

Bu aslında aynı soru; İşte cevabım .
Keith Thompson

Yanıtlar:


75

Eğer yazarsan:

int* i, j, k;

yanıltıcı bir şekilde, tüm ben, j ve k'nin işaretçiler olduğunu önerirsiniz int.

Bu yüzden * değişkeninin ismini * eklemenin daha üstün olduğunu iddia ediyorum.


35
Ve önerdiğim int * i;bir rakip olmayan sadece hızlı bir bakışta çarpma gibi görünüyor çünkü.
John K

1
+1 çünkü bu senaryoyu daha önce düşünmedim.
Pops

4
“yanıltıcı bir şekilde tüm i, j ve k öğelerinin int için işaretçiler olduğunu önerirsiniz” C # yazmıyorsanız, nerede int*bir tür olarak görülür ve int* i, jiki işaretçi bildirir. Sorunun eksik olduğu düşünülebilir - bu, hangi stillerin makul olduğunu kullandığınız dile göre değişir. CI'da int *x, C #'da aksi halde yaparım.
Joren,

1
@Joren: Üzgünüm, C # programcısı olmamakla ilgili olarak, sorudaki kod parçasına bakarak basitçe C veya C ++ olduğunu varsaydım.
Randall Schulz

C # özellikle belirtilmediği sürece, C veya C ++ 'ı varsaymak için kesinlikle makul olduğunu düşünüyorum. Biri C # 'da işaretçileri çok sık görmez.
alternatif

62

Ben tercih ederim int* içünkü i"int to pointer" tipine sahip ve bunun onu type sistemi ile aynı hale getirdiğini hissediyorum. Tabii ki, iyi bilinen davranış, bir satırda birden fazla işaretçi tanımlamaya çalışırken (yani, bir işaretçi tanımlamak için her değişken adının önüne bir yıldız işareti koymak gerekir) giriyor, ama ben sadece işaretçileri bu şekilde beyan etmiyorum. Ayrıca, C tarzı dillerde ciddi bir kusur olduğunu düşünüyorum.


8
Ben de bu sözleşmeyi takip ediyorum. Aynı sebepten.
gablin

5
Şahsen, kodumda birden fazla işaretçi bildirirsem, kod kokusu olarak kabul ediyorum. Bu kadar çok göstericiye ihtiyacım olmamalı; ve genellikle, bilmiyorum. Dolayısıyla, tek bir satırda birden fazla bildirim yapılması hiçbir zaman yazdığım bir kodda çıkmaz: Her satır için bir bildirim.
greyfade

5
Bununla ilgili sorun, türün "bir int işaretçisi" olmamasıdır. C (ve C ++) işaretçi türüne sahip değildir. İnt türünde olan bir bellek bloğunun işaretçisidir.
Billy ONeal

10
Bunun *ibir çeşidi olduğunu savunuyorum int.
Tim Goodman

5
@Billy: Öyleyse, 12 yıl boyunca standartları anlamaya, ayrıştırmaya ve açıklamaya çalışırken bu karışıklığı hiç görmedim. "İşaretçi bir int" C ve C ++ 'da mükemmel geçerli bir türdür.

23

Türlere güçlü bir odaklanmadığımız C için tercih ederim:

int *i;

Çünkü intişaretçi üzerinde değil, üzerinde bir efekt vardır . Nedir int? *iint.


2
İyi bir nokta. İşaretçilerle, başlangıcı adın bir parçası olarak düşünebilirsiniz. Örneğin, varsa int i = 5, değerini almak iiçin adı kullanırsınız i. Aynı şekilde, eğer varsa int *i; *i = 5, o zaman değeri almak için kullanırsınız *i.
mipadi

İnt * i olarak okudum: * i bir int. Bu nedenle ben int için bir işaretçi. C kullanım tipi ifadelerindeki değişken bildirimler, int ve * sadece işleçlerdir. int * i, int (* (i)) olarak ayrıştırılır ve pointer-to integer türünde yorumlanır. char * p [], char (* ([] (p))) gibi ayrıştırır (çünkü [], * değerinden daha yüksek önceliğe sahiptir) ve şu anlama gelir: p, pointer-to-char karakter dizisine sahiptir.
Giorgio

Bu nedenle, değişkenin yanına * yazmayı seçtiklerini düşünüyorum, çünkü * ona uygulanan bir işleçtir.
Giorgio

7

Ben int* iyıllardır tercih ettim . Ancak, int *ieski stili kullanırken çoklu bildirim kuralını hatırlamanız gerektiğine dair güçlü bir argüman var :

int* a, *b; // not int* a, b;

Bu kuralı hatırlamanız gerektiğinden, basit bir şekilde kazanamazsınız - ama bunun da daha karmaşık olduğunu söyleyemem. Bir satırda birden fazla beyandan kaçınmak, bu kuralı hatırladığınızı söylemenin başka bir yoludur. İki stil arasındaki fark çok fazla.

Bununla birlikte, kullandığım halde bile, C beyanı sözdiziminin ondan başka bir şey yapmadan, yıldız işaretini, sözdizimsel olarak bağlı olduğu değişkenin yerine türün yanına yerleştirerek yaptığı gibi davranması biraz aptalca geliyor.

Bu bir içine ben almayın vurgular (için işaretçi türü idiğer (için int türünü vurgular iken) *i), ancak o C ve C ++ kullanım 15 yıl sonra, sadece o olabilir olduğu olmaksızın, bunun baktığınızda Bunun hakkında düşünmek zorunda ⁠ —Bu soruyu soran çoğu yeni başlayanlar için henüz yapamadıklarınız.

Ayrıca, tercihlerime rağmen, diğer stilde kod okuma / yazma zor değil. Tutarlılık, bla bla blah.

Söylemene bile gerek yok int * i.


6

Birincisini tercih ederim. İşaretçi olarak bu türün bir parçası olarak doğal geliyor.

C # kullandığımdan, türleri C'den daha sezgisel bir şekilde ele alıyor, bu yüzden aynı ifadede birkaç işaretçi bildirmekte sorun yok:

int* a, b, c; // three pointers


4

Birden fazla değişken bildirmek ancak yıldız işaretini tekrarlamak istemiyorsanız:

template <typename T>
struct pointer_to
{
    typedef T* type;
};

pointer_to<int>::type p1, p2, p3;

(Yapısal şablonun içinde görebileceğiniz gibi, int* istili tercih ediyorum .)

Ve burada daha genel bir çözüm:

template <typename T>
struct identity
{
    typedef T type;
};

identity<int*>::type p1, p2, p3;

Bu, herhangi bir "problemli tip" ile çalışır, örneğin diziler ve referanslar:

identity<int[10]>::type a1, a2, a3;

identity<int&>::type r1(*p1), r2(*p2), r3(*p3);

omg, c ++ her zaman benim için yeni bir şey gösterir :). Teşekkürler!
Tamás Szelei 27:10

1
OMG, C ++ korkunç! typedef int* int_ptrhile yapmış olurdu. Elbette, farklı işaretçi tipleri için yeni bir typedef tanımlamak zorundayım, ancak pratikte bu kaç olacaktır? En fazla sekiz tane?
benzado

1
@benzado Uygulamada, tipik tanımlamaya veya gösterdiğim fantezi numaralarından herhangi birine ihtiyacınız yok çünkü aklı başında hiç kimse bir satırda birden fazla değişken bildirmedi. Yine de ilginç.
fredoverflow

2
Biliyorum, C ++ programlarının sadece dil özelliklerini kullanma eğilimleri hakkında konuşuyorlardı.
benzado

@benzado: !!! Bunu çok sık gördüm!
Giorgio

2

int* i;İlk bölüm değişken tipini (int işaretçisi int), ikinci bölüm ismi ( i) belirtirken bunun için giderdim . Türün intve adın olması bana mantıklı gelmiyordu *i. Ayrıca, int * i;bana çarpma gibi biraz görünüyor.


C beyanı sözdizimi bu bağlamda tutarlı değildir, çünkü tür bilgisi tanımlayıcıdan sonra kolayca gelebilir: diziler en net örnek olur.

@Roger: Biliyorum, ama bu soru özellikle tek bir değişken bildirimi ile ilgiliydi, başka bir şey yoktu.
Allon Guralnek

Bence bu biraz fazla okuyor. :) Soruyu anladığım gibi, her yerde hangi tarzı kullandığınızı soruyor.

@Roger: Muhtemelen haklısın, ama amacım OP'nin sorusuna cevap vermekti: "İşaretçi ilan etmek için en sevdiğin yöntem nedir?". Açıkçası, herkes soru sorusunda sunulan konuya bakmakta özgürdür ve burada bile teşvik edilmektedir. C / C ++ 'da gelişmeyen biri olarak, bunu yaparken uzmanlık alanımdan uzak duracağımı hissettim.
Allon Guralnek

2

Kullandığım bildirimlerde int * i;, olarak okudun i is a pointer to an integer.

İşaretçi, hem türe hem de değişkene katkıda bulunur, böylece ortada olmalıdır.

Aynı satırda birden fazla şey bildirmekten kaçınmak iyi bir şeydir: int * i, j;


1

Aslında her üç sözleşmeyi de özel durumlarda kullanıyorum. İlk bakışta tutarsız görünüyorum ama ...

  • int * tanımlayıcı olmadığında, adın mevcut olmadığını görsel olarak pekiştirmek için.
  • int* intptron typedefve benzeri bildirimler, bu türün bir parçası olduğunu görsel olarak pekiştirmek için. İşlev işaretçi bildirimleri ile benzer şekilde:(int* (*foo)(int))
  • int *identifierve class &identifierparametre parametrelerinin görsel olarak güçlendirilmesi için fonksiyon parametrelerinde potansiyel olarak "dışarı" adı verilen bir parametredir.
  • const int * const * constne zaman cv niteleyicileri kullanırsam .
  • int * foo; yerel bildirimlerde.

Sanırım biraz görsel odaklıyım.


1

C işaretçisi yok! Yani, "int *" hiçbir şey ifade etmiyor. Yıldız işareti her zaman üzerinde yazılı olan elemana bağlanır, haklı olan elemana aittir. "* i" bir int'dir. Ve * i bir int olduğu için, int için bir işaretçi olduğumu izler. Bunun arkasındaki mantık işte bu yüzden "int * i" olası bir çözümdür. Diğer her şey bir illüzyondur (çoğu durumda derleyici tarafından otomatik olarak düzeltilir). C ++ ve C # 'da farklı bir şey var. Ama C için sadece bir tane İncil var: "Dennis M. Ritchie: C Programlama Dili". Dennis (RIP!) Şunu yazdı: "int * i". Bunu sorgulamaya gerek yok.


6
"C'de işaretçi türü yok" - Bu fikri nereden buldun? int*işaretçi türüdür.
Keith Thompson

-2

Kullanıyorum int *içünkü bunun bir işaretçi olduğunu görmek daha kolay, ancak bunun gerçekten önemli olduğunu düşünmüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.