Может ли кто-нибудь любезно объяснить правила объявления массива и указателя?
Ниже то, что я нашел. Однако я не понимаю, почему int *p[10]
средства an allocation of 10 consecutive memory blocks (each can store data of type int *)
, в то время как int (*p)[10]
средства declaring a pointer to an array of 10 consecutive memory blocks (each can store data of type int)
, Какие правила стоят за этими кодами?
int p[10]; //10 consecutive memory blocks (each can store data of type int) are allocated and named as p
int *p[10]; //10 consecutive memory blocks (each can store data of type int *) are allocated and named as p
int (*p)[10]; //p is a pointer to an array of 10 consecutive memory blocks (each can store data of type int)
В настоящее время мое предположение о правилах таково:
xxx[10]
будет интерпретироваться как please allocating 10 memory blocks in which each blocks may store xxx
, Следовательно, int *p[10]
будет приведен в 10 memory blocks in which each can store data of type int *
;
(*p)
будет интерпретироваться в первую очередь из-за ()
, и это приведет к указателю, указывающему куда-то. Следовательно, int (*p)[10]
будет приведен в a pointer to an array of 10 consecutive memory blocks (each can store data of type int)
,
Извините за мой плохой английский. Надеюсь, вы понимаете, о чем я.
Любая помощь приветствуется! Большое спасибо!
C использует инфиксная запись для типов. Массив из 10 int имеет тип int [10]
Однако все, что полученный от типа массива, вывод происходит между int
и [10]
(не в конце, как в некоторых других языках).
Если мы объявим переменную, имеющую этот тип, это не int [10] arr;
, это int arr [10];
Точно так же указатель на массив из 10-ти целых int [10] *
, но это int (*) [10]
,
Причина ()
необходимы, потому что int * [10]
будет массив из 10 int *
, ()
иметь эффект разрушения int
и *
, так что он не может быть проанализирован как тип int *
, Они ничего не значат, кроме этого.
Вы фактически уже цитировали правила. Единственное, что нужно добавить, это то, что вам лучше написать это так:
int* p[10];
^------ belongs to int
int (*p)[10];
^---- belongs to p, ie p is pointer to int[10]
Если вы не уверены, вы всегда можете проверить http://cdecl.org/
PS:
На самом деле синтаксически имеет смысл написать (1), а не (2):
int *a; // (1)
int* a; // (2)
потому что для объявления двух указателей нужно написать:
int *a,*b; // and not int *a,b; !!
Однако семантически *
является частью типа, т.е. оба (1) и (2) объявляют (int*)
названный a
что более четко выражено выражением (2). По этой причине объявления более чем одного указателя обычно помещаются в отдельные строки:
int* a;
int* b;