2016-02-10 3 views

ответ

6

Вы можете ответить на этот вопрос самостоятельно, используя http://cdecl.org/ (вставьте его в тип и сообщите, что это означает на английском языке).

Они оба означают одно и то же?

No.

ли смысл их отличаются между C и C++?

No.

int* a[5] представляет собой массив из пяти указателей на INT.

int (*a)[5] - указатель на массив из пяти целых чисел.

+0

Я вечно благодарен за сайт треков. Теперь я понимаю разницу. – quantum231

+0

Однако все еще можно использовать int * a для указания массива точно так же, как int * a [5], и оба являются взаимозаменяемыми. Является ли арифметическая проверка указателя на int * a [5], если указатель перемещен в несуществующий 6-й элемент? – quantum231

+0

@ quant231, C и C++ не требуют никакой арифметической проверки указателя. И они не взаимозаменяемы. 'int * a1 [5]; int (* a2) [5]; * a1 = * a2; 'компилирует ok, но' * a2 = * a1; 'нет. Выяснить, почему в качестве упражнения для читателя. –

2

Они не одинаковы:

int * a[5] представляет собой массив из пяти элементов, каждый элемент представляет собой указатель внутр.

int (*a)[5] - указатель на массив, этот массив содержит пять элементов int.

Это значение одинаково для c и C++.

Для быстрой, используя http://cdecl.org/ (не рекомендуется)

Для понимания, чтения How to interpret complex C/C++ declarations (рекомендуется)

2

В C и C++, в 2 декларации смысл не меняется. В объявлениях C и C++ '[]' имеет более высокий приоритет, чем '*' при объединении с переменными. Таким образом, в объявлении int * x [5] x объединяется с [5], поэтому это 5-элементный массив из int *. Однако в заявлении int (* x) [5] x принудительно объединяется с '*' с помощью '()', поэтому теперь x является указателем на int [5].

4

Используйте правое правое правило.

Начать с объявления переменной - x.

Теперь читайте до тех пор, пока вы не нанесете верхний уровень ,, ; или неуравновешенное закрытие ) или конец декларации.

Прочтите влево, пока не найдете подходящее (. Повторяйте с самого начала.

x) // x 
(*x) // is a pointer to 
(*x)[5]; // an array of 5 elements 
int (*x)[5]; // of integers 

x[5]; // x is an array of 5 elements 
*x[5]; // of pointers to 
int *x[5]; // integers 

Простой!

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