о объявлении смеси массива и указателя

Может ли кто-нибудь любезно объяснить правила объявления массива и указателя?

Ниже то, что я нашел. Однако я не понимаю, почему 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),

Извините за мой плохой английский. Надеюсь, вы понимаете, о чем я.
Любая помощь приветствуется! Большое спасибо!

0

Решение

C использует инфиксная запись для типов. Массив из 10 int имеет тип int [10]Однако все, что полученный от типа массива, вывод происходит между int и [10] (не в конце, как в некоторых других языках).

Если мы объявим переменную, имеющую этот тип, это не int [10] arr;, это int arr [10];

Точно так же указатель на массив из 10-ти целых int [10] *, но это int (*) [10],

Причина () необходимы, потому что int * [10] будет массив из 10 int * , () иметь эффект разрушения int и * , так что он не может быть проанализирован как тип int *, Они ничего не значат, кроме этого.

2

Другие решения

Вы фактически уже цитировали правила. Единственное, что нужно добавить, это то, что вам лучше написать это так:

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;
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector