2008-10-28 3 views
30

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

int (*data[2])[2]; 
+0

Эта ссылка Microsoft может помочь. (Или это может просто заставить ваш мозг взорваться) [Интерпретация более сложных деклараторов] (http://msdn.microsoft.com/en-us/library/1x82y1z4.aspx) – 2008-10-28 20:25:20

ответ

37

Для чего нужны круглые скобки?

В скобках C [] имеют более высокий приоритет, чем звездочка *

Хорошее объяснение из Википедии:

Чтобы объявить переменную как быть указатель на массив, мы должны используйте круглые скобки . Это связано с тем, что в C скобки ([]) имеют более высокий приоритет , чем звездочка (*). Так что если мы хотим, чтобы объявить указатель на массив, мы должны поставить скобки, чтобы переопределить:

double (*elephant)[20]; 

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

Чтобы объявить указатель на массив указателей , просто соедините ноты .

int *(*crocodile)[15]; 

Source.

И ваш фактический случай:

int (*data[2])[5]; 

данных представляет собой массив из 2-х элементов. Каждый элемент содержит указатель на массив из 5 целых чисел.

Так вы, вы могли бы в коде, используя тип вашей «данные»:

int (*data[2])[5]; 
int x1[5]; 
data[0] = &x1; 
data[1] = &x1; 

data[2] = &x1;//<--- out of bounds, crash data has no 3rd element 
int y1[10]; 
data[0] = &y1;//<--- compiling error, each element of data must point to an int[5] not an int[10] 
+0

отличный ответ! – J3STER 2017-01-31 03:35:28

14

Существует очень крутая программа под названием «Cdecl», которые вы можете скачать для Linux/Unix и, возможно, для Windows, а также. Вы вставляете объявление переменной C (или C++, если используете C++ decl), и оно процитировано простыми словами.

+1

+1 для упоминания cdecl – user7116 2009-10-02 17:33:45

+1

С именем, подобным @sixlettervariables, я предполагаю, что вы еще более старая школа, чем я. Скажите, пожалуйста, вы помните заповеди Генри Спенсера? – 2009-10-02 18:06:26

+1

Рисунок Я бы упомянул, что cdecl теперь является веб-сайтом: [cdecl.org] (http://cdecl.org/) – Urchin 2015-02-12 22:14:42

-1

данные [2] - массив из двух целых чисел

* Данные [2] - указатель на массив из двух целых чисел

(* Данные [2]) - "

(* данные [2]) [2] - массив из 2 указателей на массивы двух целых чисел

4

Если вы знаете, как читать выражения в C, то вы один шаг от чтения сложных деклараций

..

Что

char *p; 

на самом деле означает? Это означает, что *p является символом.Что такое

int (*data[2])[5]; 

средний? Это означает, что (*data[x])[y] является int (при условии 0 < = x < 2 и 0 < = y < 5). Теперь подумайте, каковы последствия этого. data должен быть ... массивом из 2 ... указателей ... для массивов из 5 ... целых чисел.

Вам не кажется, что это довольно элегантно? Все, что вы делаете, указывает тип выражения. Как только вы поймете это, объявления никогда не будут запугать вас снова!

«Быстрое правило» должно начинаться с имени переменной, сканировать вправо до тех пор, пока вы не нажмете a), вернитесь к имени переменной и сканируйте влево, пока не нажмете a. пара скобок, и повторить процесс

Давайте применим это к чему-то нелепому:.

void **(*(*weird)[6])(char, int); 

weird является указателем на массив из 6 указателей на функцию каждого приема полукокса и междунар в качестве аргумента, и каждый возвращающий указатель на указатель на пустоту.

Теперь, когда вы знаете, что это такое и как это делается ... не сделайте это. Используйте typedefs, чтобы разбить ваши объявления на более управляемые куски. Например.

typedef void **(*sillyFunction)(char, int); 

sillyFunction (*weird)[6]; 
-1

Если у вас есть массив:

int myArray[5]; 
int * myArrayPtr = myArray; 

бы вполне разумным. myArray без скобок - указатель на int. Когда вы добавляете скобки, то, как вы, уважайте указатель myArray. Вы можете написать ...

myArrayPtr[1] = 3; 

Что вполне разумно. Использование скобок просто усложняет чтение и понимание ИМО. И они показывают, что люди не понимают указатели, массивы и арифметику указателей, а именно, как компилятор или компоновщик переходят от одного к другому. Кажется, что в скобках вы все равно проверяете границы.

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