it-swarm-tr.com

İşaretçi bildirimlerine yıldız işareti yerleştirme

Son zamanlarda C/C++ 'ı nihayet öğrenmem gerektiğine karar verdim ve işaretçiler hakkında ya da daha kesin olarak tanımlamaları konusunda gerçekten anlamadığım bir şey var.

Peki ya bu örnekler:

  1. int* test;
  2. int *test;
  3. int * test;
  4. int* test,test2;
  5. int *test,test2;
  6. int * test,test2;

Şimdi, anladığım kadarıyla, ilk üç vaka da aynı şeyi yapıyor: Test bir int değil, birine işaret ediyor.

İkinci örnek set biraz daha zor. 4. durumda, hem test hem de test2 bir int işaretçisi olacaktır, oysa 5, sadece test bir işaretçi iken test2 bir "gerçek" int'dir. Peki ya dava 6? Dava 5 ile aynı mı?

71
Michael Stum

4, 5 ve 6 aynı şeydir, sadece test bir işaretçidir. İki işaretçi istiyorsanız, kullanmanız gerekir:

int *test, *test2;

Veya daha da iyisi (her şeyi netleştirmek için):

int* test;
int* test2;
116
Milan Babuškov

Yıldızların etrafındaki beyaz alanın önemi yoktur. Üçü de aynı anlama geliyor:

int* test;
int *test;
int * test;

"int *var1, var2", yalnızca insanları şaşırtmak için kullanılan ve kaçınılması gereken kötü bir sözdizimidir. Şunlara genişler:

int *var1;
int var2;
41
Ates Goral

C/C++ bildirimlerini ayrıştırmaya yardımcı olmak için "Clockwise Spiral Rule" kullanın; 

İzlenecek üç basit adım vardır:

  1. Bilinmeyen elementten başlayarak spiral/saat yönünde ilerletin. yönü; Aşağıdaki elemanlarla karşılaştığınızda bunları değiştirin. İlgili ingilizce ifadeler: 

    [X] veya []: ... dizisinin X boyutu ... veya dizinin tanımlanmamış boyutu ... 

    (type1, type2): type1 ve type2 döndüren işlev ...

    *: işaretçi (ler) ...

  2. Tüm belirteçleri kaplayana kadar bunu spiral/saat yönünde yapmaya devam edin. 
  3. Her zaman önce parantez içindeki herhangi bir şeyi çöz!

Ayrıca, bildirimler mümkün olduğunda ayrı beyanlarda bulunmalıdır (bu çoğu zaman geçerlidir).

32
Michael Burr

Birçok kodlama yönergesi yalnızca satır başına bir değişken bildirmenizi önerir. Bu, bu soruyu sormadan önce sahip olduğunuz herhangi bir karışıklığı önler. Çalıştığım C++ programcılarının çoğu buna bağlı görünüyor.


Bildiğim bir kenara biraz, ama yararlı bulduğum bir şey geri bildirimleri okumaktır.

int* test;   // test is a pointer to an int

Bu, özellikle inşaat kalemi göstermeye başladığınızda ve göstergenin işaretin gösterilip gösterilmediğini ya da göstergenin işaret ettiği şeyin const olduğunu bilmek zorlaşmaya başlar.

int* const test; // test is a const pointer to an int

int const * test; // test is a pointer to a const int ... but many people write this as  
const int * test; // test is a pointer to an int that's const
29
Scott Langham
#include <type_traits>

std::add_pointer<int>::type test, test2;
11
fredoverflow

Diğerlerinin de belirttiği gibi, 4, 5 ve 6 aynıdır. Genellikle, insanlar bu örnekleri * türünün değişkenine ait olduğu argümanını yapmak için kullanırlar. Bu bir stil meselesi olsa da, böyle düşünmeniz ve yazmanızın gerektiği konusunda bazı tartışmalar var:

int* x; // "x is a pointer to int"

veya bu şekilde:

int *x; // "*x is an int"

FWIW Ben ilk kamptayım, ancak başkalarının ikinci form için tartışmasını yapmasının sebebi (çoğunlukla) bu özel sorunu çözmesi:

int* x,y; // "x is a pointer to int, y is an int"

potansiyel olarak yanıltıcı olan; onun yerine sen de yazardın

int *x,y; // it's a little clearer what is going on here

ya da gerçekten iki işaretçi istiyorsanız,

int *x, *y; // two pointers

Şahsen, onu satır başına bir değişkende tutuyorum, o zaman hangi tarzı tercih ettiğiniz önemli değil.

11
huskerchad

4, 5 ve 6'da, test her zaman bir işaretçidir ve test2 bir işaretçi değildir. Beyaz boşluk (neredeyse) C++ 'da asla önemli değildir.

5

4, 5 ve 6'yı aşağıdaki gibi düşünebilirsiniz: Tipin sadece bir kez yapılması gerektiğini bildirmekle birlikte, bu tip için bir işaretçi belirtmek istiyorsanız (yıldız işareti ekleyerek) bunu yapmak zorundasınız. değişken.

Bir işaretçi değişkeni bildirirken, bir satırda birden fazla bildirmeme rağmen, değişken ve yıldız işareti arasına her zaman boşluk eklerim. Bunu yapmamak, neredeyse her seferinde caydırıcı bir ifade ile karıştırmamı sağlıyor.

1
dxh

İşaretçi, tür için bir değiştiricidir. Yıldız türünü nasıl değiştirdiğini daha iyi anlamak için soldan sağa doğru okumak en iyisidir. 'int *' "pointer to int" olarak okunabilir. Birden fazla bildirimde, her değişkenin bir işaretçi olduğunu ya da standart bir değişken olarak oluşturulacağını belirtmelisiniz.

1,2 ve 3) Test türü (int *). Boşluk önemli değil.

4,5 ve 6) Test türü (int *). Test2, int türündedir. Yine boşluklar önemsiz.

1
Ron Warholic

C'deki mantık, değişkenleri kullanım şeklinizi açıklamanızdır. Örneğin

char *a[100];

*a[42]'nin char olacağını söylüyor. Ve a[42] char işaretçisi. Ve böylece a bir karakter işaretçisi dizisidir.

Bunun nedeni, orijinal derleyici yazarlarının ifadeler ve bildirimler için aynı ayrıştırıcıyı kullanmak istemeleridir. (Bir kordon tasarımı seçimi için çok mantıklı bir sebep değil)

0
Michel Billaud

Benim düşünceme göre, yıldız yerine işaretçi adının yanına bir işaret koymak daha iyidir. Örneğin,

int *pointer1, *pointer2; // Fully consistent, two pointers
int* pointer1, pointer2;  // Inconsistent, unexpected, and thus prone to errors

İkinci dava neden tutarsız? Çünkü ör. int x,y;, aynı türden iki değişken bildirir ancak bildirgede yalnızca bir kez belirtilir. Bu, emsal ve beklenen bir davranış yaratır. Ve int* pointer1, pointer2; bununla tutarsız.

0
deLock

İlk konvansiyonun yıldızı işaretçi adının yanına koymak olduğunu söyleyebilirdim (bildirimin sağ tarafı)

Aynı kuralları uygulayabilirsiniz, ancak yazının tarafına yıldız koyarsanız, bu önemli bir şey değildir . tutarlılığın önemli olduğunu unutmayın, o yüzden her zaman aynı taraftaki yıldızdan bağımsız olarak seçmek. 

0
TheDrev