C变量声明中的括号是什么意思?

时间:2008-10-28 20:14:01

标签: c syntax

有人可以解释这意味着什么吗?

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

5 个答案:

答案 0 :(得分:40)

括号是什么?

在C括号中,[]的优先级高于星号*

维基百科的详细解释:

  

将变量声明为a   指向数组的指针,我们必须使用   括号。这是因为在C中   括号([])具有更高的优先级   比星号(*)。因此,如果我们希望声明一个指向数组的指针,我们需要提供括号来覆盖它:

double (*elephant)[20];
  

这宣称大象是一个   指针,它指向的类型是   一个包含20个双精度值的数组。

     

声明指向数组的指针   指针,简单地结合起来   符号。

int *(*crocodile)[15];

Source

您的实际案例:

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

data是一个包含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]

答案 1 :(得分:15)

有一个非常酷的程序叫做“cdecl”,你可以为Linux / Unix下载,也可能用于Windows。你粘贴一个C(或C ++,如果你使用c ++ decl)变量声明,并用简单的单词拼写出来。

答案 2 :(得分:5)

如果您知道如何在C中阅读表达式,那么您距离阅读复杂的声明只有一步之遥。

什么是

char *p;

真的是什么意思?这意味着*p是一个字符。什么

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

意思?这意味着(*data[x])[y]是一个int(提供0&lt; = x&lt; 2且0&lt; = y&lt; 5)。现在,只要想想它的含义是什么。 data必须是...一个2 ...指针的数组...到5 ...整数的数组。

难道你不觉得这很优雅吗?您所做的只是说明表达式的类型。一旦你掌握了这一点,宣言就再也不会吓到你了!

“快速规则”是从变量名称开始,向右扫描直到你点击a),返回变量名称并向左扫描直到你点击(。然后“退出”一对括号,并重复这个过程。

让我们将它应用于荒谬的事情:

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

weird是一个指向函数的6个指针数组的指针,每个函数接受一个char和一个int作为参数,并且每个指针返回一个指向void的指针。

现在您知道它是什么以及它是如何完成的...... 这样做。使用typedef将声明分解为更易于管理的块。 E.g。

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

sillyFunction (*weird)[6];

答案 3 :(得分:-1)

data [2] - 两个整数的数组

* data [2] - 指向两个整数数组的指针

(* data [2]) - “

(* data [2])[2] - 一个包含两个整数数组的2个指针的数组。

答案 4 :(得分:-1)

如果您有阵列:

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

完全合情合理。不带括号的myArray是指向int的指针。当您添加括号时,您可以使用指针myArray。你可以写......

myArrayPtr[1] = 3;

这是完全合理的。使用括号只会使事情更难以阅读和理解IMO。它们表明人们不了解指针,数组和指针算法,这就是编译器或链接器从一个到另一个的过程。用括号看来,你确实可以检查边界。