int * i; atau int * i; atau int * i; [Tutup]

30

Apa metode favorit Anda untuk mendeklarasikan pointer?

int* i;

atau

int *i;

atau

int * i;

atau

int*i;

Tolong jelaskan mengapa.

lihat juga: http://www.stroustrup.com/bs_faq2.html#whitespace

lesmana
sumber
19
Saya lebih suka fokus pada yang lain 3000 baris ...
29
int*i;- ruang putih tidak tumbuh di pohon, kau tahu ...
Shog9
Ini pada dasarnya adalah pertanyaan yang sama; inilah jawaban saya .
Keith Thompson

Jawaban:

75

Jika Anda menulis:

int* i, j, k;

Anda menyesatkan menyarankan bahwa semua i, j dan k adalah petunjuk int.

Jadi saya berpendapat itu lebih baik untuk menambahkan * ke nama variabel.

Randall Schulz
sumber
35
Dan saya sarankan int * i;adalah non-pesaing hanya karena kelihatannya seperti perkalian sekilas.
John K
1
+1 karena saya tidak mempertimbangkan skenario ini sebelumnya.
Pops
4
"Anda secara keliru menyarankan bahwa semua saya, j dan k adalah petunjuk untuk int." Kecuali Anda sedang menulis C #, di mana int*dianggap sebagai tipe, dan int* i, jmenyatakan dua pointer. Pertanyaannya bisa dianggap tidak lengkap - itu tergantung pada bahasa yang Anda gunakan gaya mana yang masuk akal. Di CI follow int *x, di C # saya lakukan sebaliknya.
Joren
1
@Joren: Maaf, bukan menjadi programmer C #, saya hanya berasumsi dengan melihat fragmen kode dalam pertanyaan itu adalah C atau C ++.
Randall Schulz
Saya pikir sangat masuk akal untuk mengasumsikan bahwa C atau C ++ kecuali C # disebutkan secara khusus. Orang tidak sering melihat pointer dalam C #.
alternatif
62

Saya lebih suka int* ikarena imemiliki tipe "pointer ke int", dan saya merasa ini membuatnya seragam dengan sistem tipe. Tentu saja, perilaku yang terkenal datang, ketika mencoba untuk mendefinisikan beberapa pointer pada satu baris (yaitu, tanda bintang harus diletakkan sebelum setiap nama variabel untuk mendeklarasikan pointer), tapi saya tidak menyatakan pointer seperti ini. Juga, saya pikir itu adalah kerusakan parah dalam bahasa gaya-C.

Tamás Szelei
sumber
8
Saya juga mengikuti konvensi ini. Untuk alasan yang sama.
gablin
5
Secara pribadi, jika saya mendeklarasikan banyak pointer dalam kode saya, saya memperlakukannya sebagai bau kode. Saya seharusnya tidak membutuhkan banyak petunjuk; dan biasanya tidak. Jadi masalah beberapa deklarasi pada satu baris tidak pernah muncul dalam kode apa pun yang saya tulis: Satu deklarasi per baris.
greyfade
5
Masalahnya adalah jenisnya bukan "penunjuk ke int". C (dan C ++) tidak memiliki tipe pointer. Ini adalah penunjuk ke blok memori, di antaranya adalah tipe int.
Billy ONeal
10
Saya berpendapat bahwa *imemiliki jenis int.
Tim Goodman
5
@Illy: Jika demikian, saya belum pernah melihat kebingungan itu dalam 12 tahun mencoba memahami, mengurai, dan menjelaskan bahasa standar. "Pointer to int" adalah tipe C dan C ++ yang benar-benar valid.
23

Untuk C, di mana kami tidak memiliki fokus yang kuat pada tipe, saya lebih suka:

int *i;

Karena memiliki penekanan pada int, bukan pointer. Apa itu int? *iadalah int.

alternatif
sumber
2
Poin bagus. Dengan pointer, Anda dapat menganggap awal sebagai bagian dari nama. Misalnya, jika sudah int i = 5, untuk mendapatkan nilai i, Anda menggunakan namanya i. Demikian juga, jika sudah int *i; *i = 5, maka untuk mendapatkan nilainya, Anda gunakan *i.
mipadi
Saya membaca int * i sebagai: * i adalah int. Karena itu saya adalah pointer ke int. Deklarasi variabel dalam ekspresi tipe C, int dan * hanyalah operator. int * i mem-parsing sebagai int (* (i)) dan ditafsirkan sebagai saya memiliki tipe pointer-to integer. char * p [] diuraikan sebagai char (* ([] (p)))) (karena [] memiliki prioritas lebih tinggi dari *) dan berarti: p memiliki tipe array-of pointer-to char.
Giorgio
Untuk alasan ini saya pikir mereka memilih untuk menulis * di sebelah variabel, karena * adalah operator yang menerapkannya.
Giorgio
7

Saya lebih suka int* iselama bertahun-tahun. Namun, ada argumen kuat int *ikarena ketika menggunakan gaya sebelumnya, Anda masih harus mengingat beberapa aturan deklarasi:

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

Karena Anda harus mengingat aturan ini, Anda tidak memperoleh apa pun secara sederhana — tetapi saya juga tidak akan mengatakan itu lebih rumit. Menghindari banyak deklarasi pada satu baris hanyalah cara lain untuk mengatakan Anda mengingat aturan ini. Perbedaan antara kedua gaya adalah moot.

Bahkan ketika saya menggunakannya, rasanya agak konyol untuk menganggap sintaks deklarasi C bekerja selain dari itu, dengan menempatkan tanda bintang di sebelah tipe daripada variabel yang terikat secara sintaksis.

Saya tidak membeli ke salah satu yang menekankan jenis pointer (untuk i) sementara yang lain menekankan tipe int (untuk *i), tapi itu mungkin bahwa setelah 15 tahun C dan C ++ digunakan, itu hanya merupakan ketika saya melihat itu, tanpa harus memikirkannya— —sebagian besar pemula yang menanyakan pertanyaan ini belum dapat melakukannya.

Juga, meskipun diberi preferensi saya, saya tidak merasa canggung untuk membaca / menulis kode dengan gaya lain. Konsistensi, bla bla bla.

Bahkan tidak perlu disebutkan int * i.


sumber
6

Saya lebih suka yang pertama. Menjadi alami karena menjadi pointer adalah bagian dari tipenya.

Saat saya menggunakan C #, ia menangani jenis dengan cara yang lebih intuitif daripada C, jadi tidak ada masalah mendeklarasikan beberapa petunjuk dalam pernyataan yang sama:

int* a, b, c; // three pointers
Guffa
sumber
5

Saya lebih suka int* i(gaya C ++).
Saya menghindari mendeklarasikan beberapa variabel dalam satu pernyataan karena ambiguitas visual yang dihasilkan ( int* i, j).

Lihat juga FAQ Gaya dan Teknik C ++ dari Bjarne Stroustrup untuk alasan-alasannya.

Archimedix
sumber
4

Jika Anda ingin mendeklarasikan beberapa variabel tetapi tidak ingin mengulang tanda bintang:

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

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

(Seperti yang Anda lihat di dalam template struct, saya lebih suka int* igaya.)

Dan inilah solusi yang lebih umum:

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

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

Yang ini bekerja dengan "tipe bermasalah" apa pun, misalnya array dan referensi:

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

identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
fredoverflow
sumber
omg, c ++ selalu menunjukkan sesuatu yang baru untuk saya :). Terima kasih!
Tamás Szelei
1
OMG, C ++ mengerikan! typedef int* int_ptrakan melakukan trik. Tentu, saya harus mendeklarasikan typedef baru untuk tipe pointer yang berbeda, tetapi dalam praktiknya berapa banyak? Paling banyak delapan?
benzado
1
@ Benzado Dalam prakteknya, Anda tidak memerlukan typedef atau trik-trik mewah yang saya tunjukkan, karena tidak ada orang waras yang menyatakan banyak variabel dalam satu baris. Tapi tetap menarik.
fredoverflow
2
Saya tahu, saya berbicara lebih banyak tentang kecenderungan program C ++ untuk menggunakan fitur bahasa hanya karena mereka bisa.
benzado
@benzado: !!! Saya sudah sering melihat ini!
Giorgio
2

Saya akan menggunakan int* i;karena bagian pertama menunjukkan tipe variabel (pointer ke int), sedangkan bagian kedua menunjukkan nama ( i). Tidak masuk akal bagi saya bahwa tipenya intdan namanya *i. Juga, int * i;tampak seperti multiplikasi bagi saya.

Allon Guralnek
sumber
Sintaksis deklarasi C tidak konsisten dalam hal ini, karena informasi tipe dapat dengan mudah muncul setelah pengidentifikasi: array menjadi contoh paling jelas.
@Roger: Saya tahu, tapi pertanyaan ini khusus tentang deklarasi variabel tunggal, dan tidak ada yang lain.
Allon Guralnek
Saya pikir itu sedikit banyak membacanya. :) Cara saya memahami pertanyaan, itu bertanya tentang gaya yang Anda gunakan di mana-mana.
@Roger: Anda mungkin benar, tetapi tujuan saya adalah untuk menjawab pertanyaan OP: "Apa metode favorit Anda untuk mendeklarasikan pointer?". Jelas, semua orang bebas untuk melihat masalah yang disajikan dalam pertanyaan, dan bahkan didorong di sini. Sebagai seseorang yang tidak berkembang dalam C / C ++, saya merasa melakukannya akan menyimpang terlalu jauh dari bidang keahlian saya.
Allon Guralnek
2

Dalam deklarasi yang saya gunakan int * i;, Anda membacanya sebagai i is a pointer to an integer.

Pointer berkontribusi untuk tipe dan variabel sehingga harus di tengah.

Merupakan hal yang baik untuk menghindari menyatakan banyak hal pada baris yang sama: int * i, j;

Tamara Wijsman
sumber
1

Saya benar-benar menggunakan ketiga konvensi dalam keadaan tertentu. Pada pandangan pertama saya sepertinya tidak konsisten, tapi ...

  • int * ketika pengenal tidak ada, untuk memperkuat secara visual bahwa nama itu tidak ada.
  • int* intptrpada typedefs dan deklarasi serupa untuk secara visual memperkuat bahwa itu adalah bagian dari tipenya. Demikian pula dengan deklarasi fungsi pointer:(int* (*foo)(int))
  • int *identifierdan class &identifierpada parameter fungsi untuk memperkuat secara visual bahwa parameter tersebut berpotensi sebagai parameter yang disebut "keluar".
  • const int * const * constsetiap kali saya menggunakan kualifikasi cv .
  • int * foo; pada deklarasi lokal.

Saya kira saya agak berorientasi visual.

greyfade
sumber
1

Tidak ada tipe pointer di C! Jadi, "int *" tidak ada artinya. Tanda bintang selalu terikat pada elemen yang dituliskan dengan benar, itu milik elemen yang berhak atasnya. "* i" adalah sebuah int. Dan karena * i adalah sebuah int, maka saya adalah pointer ke int. Itulah logika di baliknya dan itulah mengapa "int * i" adalah satu-satunya solusi yang mungkin. Yang lainnya adalah ilusi (yang secara otomatis dikoreksi oleh kompiler dalam banyak kasus). Dalam C ++ dan C # itu sesuatu yang berbeda. Tetapi untuk C hanya ada satu Alkitab: "Dennis M. Ritchie: The C Programming Language". Dennis (RIP!) Menulisnya: "int * i". Tidak perlu mempertanyakan ini.

Lexi Pim
sumber
6
"Tidak ada tipe pointer di C" - Dari mana Anda mendapatkan ide itu? int*adalah tipe pointer.
Keith Thompson
-2

Saya menggunakan int *ikarena lebih mudah untuk melihat bahwa itu adalah pointer, meskipun saya pikir itu tidak masalah.

tia
sumber