Di sini saya memiliki pointer ptr
ke array arr
4 bilangan bulat. ptr
menunjuk ke seluruh array. ptr[0]
atau *ptr
menunjuk ke elemen pertama array, jadi menambahkan 1 untuk ptr[0]
memberikan alamat elemen kedua array.
Saya tidak mengerti mengapa menggunakan sizeof(ptr[0])
memberikan ukuran seluruh array, 16 byte, bukan hanya ukuran elemen pertama, 4 byte, (sebagai ptr[0]
poin ke elemen pertama dalam array).
int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16
int *ptr = arr;
? Itu akan membuatnya menunjuk ke awal (elemen pertama) array, yang setara dengan&arr[0]
.int *ptr = arr;
? Sebenarnya tidak.int (*ptr)[4]
menciptakanptr
sebagai penunjuk ke array penuh dari empatint
nilai. Sintaksis pointer seperti itu diperlukan untuk mengalokasikan array true-multidimensional secara dinamis. "Array 2 dimensi" yang dibuat denganmalloc()
loop bersarang dan digambarkan secara keliru sebagai array multidimensi adalah benar-benar array pointer 1-ke beberapa array 1-d. Lihat stackoverflow.com/questions/42094465/…Jawaban:
Ketik kebingungan.
ptr[0]
adalah sebuah array.ptr
adalah pointer ke array 4 int .ptr[0]
, seperti*ptr
menghormati pointer ke array .sizeof(ptr[0])
adalah ukuran array.Dengan
sizeof(ptr[0])
,ptr[0]
tidak menimbulkan "ekspresi dengan tipe '' pointer to type '' yang menunjuk ke elemen awal dari objek array" konversi. (c11dr §6.3.2.1 3). Dengansizeof
,ptr[0]
adalah sebuah array.sumber
&ptr[0][0]
memilikiint *
tipeptr[0]
(secara implisit dikonversi keint *
) akan mengevaluasi ke alamat elemen int pertama.printf("someforamt", ptr[0] , ptr[0]+1)
melakukan sesuatu yang berbeda darisizeof(ptr[0])
. Dalamptr[0]
kasus pertama melewati konversi yang tidak sah. Dengansizeof(ptr[0])
,ptr[0]
tidak.ptr
di sini adalah tipepointer to an array of 4 int elements
dan tipe array memiliki ukuran 16 pada platform Anda (sizeof (int) * (jumlah elemen)).karena sistem tipe C memiliki tipe array. Di sini keduanya
arr
dan*ptr
memilikinya. Apa yang Anda nyatakan bahwa Anda miliki. Untuk mendapatkan sizeof int di sini Anda harus sizeof (ptr [0] [0]) - di mana ptr [0] mengevaluasi ke array.sumber
dengan
int (*ptr)[4] = &arr ;
Anda memiliki pointer ke array empat bilangan bulat dan menunjuk ke arr.ptr
sekarang menunjuk kearr
, seperti penunjuk ganda. Kita dapat mengakses elemenarr
menggunakanptr[0][x]
manax
bisa0
untuk4
.Begitu
sizeof(ptr[0])
juga dengansizeof(arr)
sumber
Menurut definisi,
ptr[0]
sama dengan*(ptr + 0)
yang pada gilirannya sama dengan*ptr
. Selanjutnya,ptr
diinisialisasi dengan&arr
, begitu*ptr
juga*&arr
dan itu adilarr
. Perhatikan bahwa penyimpanan menengah&arr
diptr
tidak tidak melakukan salah pembusukan array, sehingga kesetaraan dipertahankan dan tidak ada informasi jenis yang hilang.Perhatikan bahwa semua ini dihitung pada waktu kompilasi, hanya untuk menghindari perangkap tambahan ini.
sumber