数组

使用#define可以创建符号常量,但使用const还可以创建数组常量、指针常量以及指向常量的指针

 

 int (* ptr)[2]  // ptr指向一个包含2个int值的数组

应用表达式中[]的优先级高于*,因此, 如果我们这样声明 int * ptr[2], 那么首先方括号和ptr结合,表示ptr是包含两个某种元素的数组,然后和*结合, 表示pax是两个指针组成的数组。最后,用int来定义,表示pax是由两个指向int值的指针构成的数组。这种声明会创建两个指向单个int值的指针。但前面的版本通过圆括号使ptr首先和*结合,从而创建了一个指向包含两个int值的数组的指针。

 

int * p;

const int * p2;

const int ** pp;

p1 = p2;  // 非法,把const指针赋给非const指针

p2 = p1;  // 合法,  把非const指针赋给const指针

pp = &p;  //非法, 把非const指针赋给const指针

把非const指针赋给const指针是允许的, 这样的赋值有一个前提:只进行一层间接运算

 

直到C99标准出现之前,声明数组时在方括号内只能使用整数常量表达式。整数常量表达式是由整数常量组成的表达式。

sizeof表达式被认为是一个整数常量, 而(和C++不一样)一个const值却不是整数常量。并且该表达式

的值必须大于0

C99允许变长数组(variable-length array), 简称VLA, 变长数组定义时不能初始化

变长数组有一些限制。变长数组必须是自动存储类,这意味着它们必须在函数内部或作为函数参量声明,而且声明时不可以进行初始化。

声明带有一个二维边长数组参数的函数

int sum2d(int rows, int cols, int arr[rows][cols]);

请注意前两个参量(rows和cols)用作数组参量arr的维数。因为arr的声明中使用了rows和cols,所以在参量列表中, 它们两个的声明需要早于arr。

c99标准规定,可以省略函数原型中的名称;但是如果省略名称,则需要用型号来代替省略的维数

int sum2d(int, int, int arr[*][*]);

 

 

int arr[3][4]

数组首元素地址表示方法   &arr[0][0]    arr[0]    (int *)arr

posted @ 2014-08-29 13:25  挨踢淫才  阅读(257)  评论(0编辑  收藏  举报