2016-02-22 5 views
8

Я программировал код на C++, когда случайно помещал скобки в свой указатель, а выход моих программ менялся.Каковы различия между этими указателями?

Поскольку я новичок в программировании, я хотел бы знать разницу между этим типом указателей:

int* A[n]; 
int (*A)[n]; 
int *(A[n]); 

Я прочитал в моем учебнике, что массивы являются также тип указателей.

+1

Массивы могут * распадаться * на указатель на их первый элемент, но это не указатель. Например, когда вы передаете массив функции или используете арифметику указателя, это происходит. –

+1

@JoachimPileborg Когда вы передаете массив функции *, параметром которой является указатель *. В основном используется имя массива для инициализации или назначения указателю, который делает это, а не переходу к функции. – juanchopanza

+0

выучите правильное по часовой стрелке правило, и вы больше не будете путаться о сложных объявлениях. Http: // StackOverflow.com/a/31789222/3758484 – johnbakers

ответ

15
int* A[n]; 

В первую очередь это массив, независимо от того, какой тип элемента. После применения указателя *, мы знаем, что A - это массив указателей int.

int (*A)[n]; 

Применяя скобки, указатель * имеет более высокий приоритет над массивом [] в этом случае. Тогда A - это, прежде всего, указатель, независимо от того, на что он указывает. После применения массива [] мы знаем, что A является указателем на массив из int.

int *(A[n]); 

Скобки не изменит любой порядок старшинства, который будет влиять на массив [], поэтому удаление скобок будет int* A[n] же получали методом в качестве 1-го корпуса.

Are array pointers? 

Номер массив является структурой данных, которая выделяет пул памяти и хранят данные последовательно, где, как указатель указует на конкретный индекс в пуле памяти и ссылки на данных, хранящиеся в этой ячейке памяти.

+0

Технически speking, массивы * являются указателями на C. – Shark

+14

@Shark Нет, массивы могут * распадаться * указателям на их первый элемент, но массив не является самим указателем. –

+4

@Shark 'sizeof' будет просить отличаться. – juanchopanza

2

Эта статья содержит хорошие примеры в объявлениях типа чтения в С. http://www.unixwiz.net/techtips/reading-cdecl.html

В принципе, вы можете прочитать типы в соответствии со следующей очередности:

  1. (часто круглые скобки) Inner-самый тип

  2. правые большинство типов (в основном типы массивов: [])

  3. ЛЕВОГО большинство типов, кроме внешних, наиболее один (В основном указатель типов: *)

  4. Внешней большинство типов (в основном примитивные типы: Int, Char ..)

Например, типы, которые вы представили, могут быть считаны следующим образом:

int* A[n]; // An array ([n]) of pointer (*) of int. 
int (*A)[n]; // A pointer (*) of array ([n]) of int. 
int *(A[n]); // An array ([n]) of pointer (*) of int. 

В основном, первый и третий тип идентичны.

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