Operator -› dalam fungsi malloc

Tonton di sini:

struct mystruct{
 int a;
 int b;
};

int main(void){
 struct mystruct* ptr;
 ptr = malloc( 10*sizeof( struct mystruct ) );

Dengan cara ini saya telah mengalokasikan array struct. Jika Anda mencoba mencetak, misalnya ptr[4], Anda akan melihat sebuah penunjuk. Ketika saya memiliki pointer dan saya memiliki akses ke anggota, saya harus menggunakan operator -> kan? Tetapi jika saya melakukannya:

ptr[4]->a

Itu tidak berhasil! saya harus melakukan

ptr[4].a 

untuk membuatnya berhasil... mengapa? Saya punya petunjuk! ptr[4] = (ptr+4) kan?

Juga dalam array normal hal ini terjadi:

struct mystruct array[10];
array[4].a

tetapi array adalah sebuah penunjuk!


person AlessandroF    schedule 10.03.2017    source sumber
comment
Jika Anda mencoba mencetak, misalnya ptr[4], Anda akan melihat sebuah penunjuk - tidak, Anda tidak akan melakukannya (yah, tergantung bagaimana Anda mencoba mencetak hal seperti itu). ptr[4] bertipe struct mystruct, ini bukan pointer.   -  person davmac    schedule 10.03.2017
comment
ptr[4] = (ptr+4) kan?. Salah! ptr[4] adalah *(ptr+4). Perhatikan bahwa *? ptr[4] bukan penunjuk.   -  person AnT    schedule 10.03.2017
comment
Anda mengalokasikan array struct mystruct bukan array struct mystruct *... dan [ ] offset dan dereferensi, sehingga memberikan struct dalam array, bukan pointer ke array tersebut.   -  person Dmitri    schedule 10.03.2017
comment
Selain itu, array sebenarnya bukan sebuah pointer (meskipun Anda juga dapat menggunakan tanda kurung pengindeksan dengan sebuah pointer). Array di sini adalah grup struct yang Anda alokasikan, bukan penunjuk yang memberi tahu Anda di mana lokasinya.   -  person Dmitri    schedule 10.03.2017
comment
tetapi array adalah sebuah pointer - TIDAK!   -  person too honest for this site    schedule 10.03.2017


Jawaban (3)


array[4] tidak sama dengan array + 4. Itu sama dengan *(array + 4).

array + 4 tentu saja merupakan sebuah pointer, tetapi array[4] adalah nilai yang ditunjuk oleh pointer (yang, tentu saja, mungkin juga merupakan sebuah pointer jika array adalah sebuah array dengan tipe pointer tertentu.)

Karena x->y pada dasarnya sama dengan (*x).y, Anda dapat menulis ulang array[4].a menjadi (array + 4)->a, namun Anda akan kesulitan melewati sebagian besar peninjau kode.

person rici    schedule 10.03.2017

saat Anda menggunakan tanda kurung siku pada sebuah penunjuk, ini mirip dengan melakukan dereferensi titik. Oleh karena itu, ia meminta sintaks p[].a, dan bukan p[]->a

(p + 4)->a is essentially the same as p[4].a
person Nova Ardent    schedule 10.03.2017

Jika ptr bertipe struct mystruct *, maka ptr[i] bertipe struct mystruct; TKI, ptr[i] bukan nilai penunjuk. Oleh karena itu, Anda perlu menggunakan operator pemilihan komponen . alih-alih ->.

person John Bode    schedule 10.03.2017