二维数组VS行指针

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二维数组 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)[列数],它们有本质的不同。
定义指针时的星号*等只是表明指针的阶数或类型,即指针中可以存放哪一类的地址值,是变量的地址?指针的地址?指针的指针的地址?行指针的地址?等等。指针本体是去除那些附属物后的标示符,如int *p = &a;在使用中p中存放的是a的地址,即p是指向a的指针,而不是*p。此规则适用于其他更复杂的指针定义。
int a;
int *p;
*p = &a;
这样的指令就是非法的,因为定义的指针变量是p而不是*p,应改为p = &a.而int *p = &a.只是在定义时赋初值的特殊情况。

相关文档
最新文档