《C Prime Plus》10.7学习笔记

288 阅读2分钟

指针和多维数组

指针真的是又难又值得人回味无穷的东西。这节把数组和多维数组的关系讲清楚了,多维数组在前面的章节就提到过,不过博客这里没有介绍,正好这次一下子把两个一起学习了。

多维数组

之前学习的都是一维数组,也就是元素全部都是具体的某种数据类型(int、double、char等),而延伸出来的多维数组,元素本身就是数组,或者说多维数组就是数组的数组。形如:

int a[3][2]={{1,2},{3,4},{56}};

声明多维数组时,数组名后面接两个以上的方括号,上方代码中,第一个方括号意味着这个名叫a的数组含有三个数组元素,第二个方括号意味着每个元素都是含有两个int元素的数组。

利用指针来表示多维数组

前面的学习学到了,数组名本质上就是指针常量。那么多维数组呢?依然拿上文的a数组距离:

int a[3][2]={{1,2},{3,4},{56}};

对于这样一个简单地二维数组,数组名指向首元素的地址,也就是{1,2}的地址,更准确说应该是数组a[0]的地址,这个数组的数组名就是a[0],这也意味着,a[0]本身也是一个指针常量,存储的是这个数组元素中的首元素的地址。而aa[0]&a[0][0]的值都是一样的,同一个内存地址。a是地址的地址,a[0]*a的值是一样的。

声明指向数组的指针

前面处理数组时,都是直接使用数组名,没有专门声明指向数组的普通指针,那么如何声明呢?如下:

int (*pi)[3];

在C语言里,[]的优先级高于*,所以必须先用圆括号括起来,这才表示pi是一个指向拥有三个int元素的数组。如果没有圆括号:

int * pi[3];

就会变成pi是一个存储了两个指针变量的数组,通俗的说,我们这里声明了一个数组,而不是指针。

指针兼容性

C语言中,指针不能像整数浮点数字符那样允许随意转换,甚至const指针和普通指针之间都不能随意进行赋值操作,因此,后续的编程中,一定要注意同类型的指针才能赋值。

多维数组的形参

在函数原型和函数定义的形参中,多维数组要注意数组名后面第一个方括号无需写入具体数值,但后续的方括号必须写明:

void sun(int ai[][3][4][5],int n);

另外,在函数原型中,函数名可以省略,但在定义里不能省略。