2016-10-08 2 views
0

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

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

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

ответ

2

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

int* p[10]; 
    ^------ belongs to int 

int (*p)[10]; 
    ^---- belongs to p, ie p is pointer to int[10] 

Если вы не уверены, вы всегда можете проверить на http://cdecl.org/

PS: Собственно syntaxwise это имело бы смысл писать (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; 
+0

спасибо! Это очень четкий и прекрасный ответ! :) –

+0

Привет. Извините. Я попытался написать 'int * a, a2;' и проверить их размер. Однако я обнаружил, что размер a отличается от a2. Согласно понятию, что '*' принадлежит 'int', не должны ли оба из них иметь одинаковый размер? Спасибо за ваше время! :) –

+0

@ 我 永遠 最 愛伊茲娜 На самом деле я не знаю правильных терминов, чтобы лучше объяснить ... Отредактировал вопрос, пытаясь прояснить – user463035818

2

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

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

Аналогичным образом, указатель на массив 10 целых чисел не int [10] *, но это int (*) [10].

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

Смежные вопросы