Pertanyaan Lewat array dalam C: tanda kurung siku vs penunjuk


Saya ingin menyampaikan array ke dalam fungsi. Dari apa yang saya lihat, ada 2 cara melakukan ini:

1

void f (int array[]) {
    // Taking an array with square brackets
}

2

void f (int *array) {
    // Taking a pointer
}

Masing-masing disebut oleh:

int array[] = {0, 1, 2, 3, 4, 5};
f (array);

Apakah ada perbedaan nyata antara 2 pendekatan ini?


4
2018-06-11 23:53


asal


Jawaban:


Tidak ada perbedaan selain dari sintaksnya. Untuk alasan historis, sekalipun int array[]  terlihat seperti itu harus melewati sebuah array, itu benar-benar melewati pointer (yang berarti itu sama dengan int *array).

Jika aku jadi kamu, aku lebih suka int *array hanya karena ia melakukan apa yang terlihat seperti itu - artinya, itu tidak akan membingungkan Anda.


4
2018-06-12 00:00



Dalam contoh spesifik Anda tidak ada perbedaan.

Dalam kasus yang lebih umum, satu perbedaan antara dua pendekatan ini berasal dari fakta bahwa dalam kasus [] syntax bahasa melakukan "biasa" cek untuk kebenaran deklarasi array. Misalnya, ketika [] syntax digunakan, tipe elemen array harus lengkap. Tidak ada persyaratan untuk sintaks pointer

struct S;
void foo(struct S *a); // OK
void bar(struct S a[]); // ERROR

Efek samping spesifik dari aturan ini adalah bahwa Anda tidak dapat menyatakan void * parameter sebagai void [] parameter.

Dan jika Anda menentukan ukuran larik, itu harus positif (meskipun diabaikan sesudahnya).


3
2018-06-12 00:29



Mereka identik, menurut definisi. Kode panggilan selalu melewati argumen larik sebagai penunjuk, meskipun terlihat seperti penelepon melewati larik. Deklarasi parameter seperti-array mungkin membuatnya terlihat lebih mirip panggilan, tetapi deklarasi parameter pointer lebih akurat mencerminkan apa yang sebenarnya terjadi.

Lihat juga entri ini dalam Daftar FAQ.

Sebagaimana Dennis Ritchie jelaskan "Pengembangan Bahasa C"Deklarasi pointer sebenarnya adalah "fosil hidup", sebuah peninggalan dari versi awal C di mana array dan pointer bekerja sangat berbeda.


1
2018-06-12 00:19