二维数组 VS 行指针:
二维数组的数组名相当于是行指针,数组名加一相当于指针指向下一行,下面讨论一些特殊问题。
当用数组名做实参传递给形参时,形参内部处理成与实参同阶的指针。也就是说,定义形参并不实际为数组分配空间,而是让一个指针指向实参传来的原数组,尽管形参形式上可以声明为数组形式。如void fun(int a[10]), 此处的a[10]内部处理成*a,并且10可缺省,因为并不需要为a数组分配10个int内存空间,只是形式上通知编译器形参应是与一维数组名相对应的指针而已。
如果对形参、实参的上述事实理解不深,容易产生以下困惑:
为什么在定义一维数组b时不可以这样:
int a[10];
int b[10] = a;
而在实参和形参传递时不是可以有这种形式吗?
理由就是诸如把a数组名传递给形参int b[10],形参内部实际把b处理成了指向a的指针*b。而此处是定义了
一个整型数组b,并为其分配10个int的空间,其中存放的值是整型数据,而a是一个地址值,因此不合法。所以我们应该把b定义成指针变量才行,即int *b = a;
在二维数组的定义中存在同样的问题。
int a[4][3];
int b[][3] = a;
基于同样的原因,这组指令非法,但在参数传递时合法。
指针与二维数组在这里只有将b定义成和a同阶的指针才行。即
int (*b)[3] = a;这里的3不可缺省,且一般必须保持和a[4][3]的列数一致。这是因为行指针需要这一参数来确定指针加一到底是向后移动多少个字节(行指针加1向后移动一行没错,但一行到底包含多少字节是由类型名和列参数决定的)。
注意一维指针数组和二维数组的数组名对应的指针变量的形式:
一维指针数组的数组名是指向指针的指针,对应的指针变量的形式为**ptr
二维数组的数组名是行指针,对应的指针变量的形式是(*ptr)[列数],它们有本质的不同。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论