二次指针与二维数组_第1页
二次指针与二维数组_第2页
二次指针与二维数组_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.二次指针与二维数组首先我们需要知道,什么是二次指针?下面的代码就定义了一个二次指针变量p2。char *p2;还是通过图来说明变量、指针变量、二次指针变量的关系吧。对于代码:char c = h;char *p1 = &c;char *p2 = &p1;其中c、p1、p2的关系如下图所示:由于“指针生成”规则(参见教材P176)的存在,我们无法将一个数组传递给一个函数。一个折中的解决办法是传递这个数组的第一个元素的地址,以及数组的各个维数,然后在函数中计算得到要操作的数组元素的地址来操作该数组元素。例如:void fun(char *p, int n, int m)/从传入指

2、针指向元素开始,将m*n个元素赋值为5 for (int i = 0; i < m; i+) for (int j = 0; j < n; j+) *(p + i*n + j) = 5;main()char a23;fun(&a00, 2, 3);return 0;显然,其中的fun(&a00, 2, 3);对数组的操作相当于: for (int i = 0; i < m; i+) for (int j = 0; j < n; j+) aij = 5;在这段代码中,aij的形式显然更为浅显易懂,也*(p + i*n + j) = 5更为安全(不容易写错)

3、。接下来我们要做的,就是希望实现这样的功能:函数能够以aij这样的下标处理一个维度变化的二维数组。通过指针数组,我们可以实现一个一维长度不同的二维数组。当然,这也就意味着该二维数组的元素在内存中的位置不一定连续了。什么在指针数组呢?看如下代码:char *pp7;这就是一个指针数组,它表示一个长度为7的数组pp,而数组pp的每一个元素的类型,都是char *。也就是说,我们可以将数组pp的元素赋值给另一个指针变量,就像这样:char *p = pp3;而联系到第一部分指针与一位数组之间的关系,我们可以有让数组pp的每个元素都指向不同的指针,比如说这样:char a13 = "ustc

4、", b17 = "1958"char *t = a + 2;char *p5 = a, b, t;/VC 6.0中可以用变量对数组的值进行初始化执行以上代码之后,p0就指向了a数组,p1就指向了b数组。而p2在这里的含义,也是指向一个数组。我们可以看到,通过指针是无法获知数组的长度的。这也就是为什么在C语言中,字符数组后面会跟一个0来作为结束标致。而在操作其他类型的数组的时候,也是需要显示在代码中指定数组的长度。printf(“%sn”, p2);上述代码执行后将输出tc因为printf函数在输出字符串的时候,会从传入的参数开始一直向外输出,直到遇到字符串结束标

5、志0。好。接下来我们要问了,char a5中,a的数据类型可以看做是一个字符指针(char *),那么char *pp7中,pp又是什么数据类型呢?这里pp的数据类型,就是我们本部分开始时提到的二次指针了。我们可以通过如下代码来声明一个二次指针变量,并且并给它赋值:char *pp7;char *p2p = pp;而就像我们可以对一个指针变量char *p进行指针运算p2或*(p + 2)获取对应的值一样,我们也可以通过如下代码获取一个指针。char *p1, *p2;p1 = p2p3;p2 = p2p5;而对于上述定义的p1、p2,我们还是仍然使用类似p2、*(p + 2)的指针运算。于是

6、,我们就能得到类似二维数组的使用方法了。char a13 = "ustc", b17 = "1958"char *p5 = a, b;/VC 6.0中可以用变量对数组的值进行初始化char *p2p = pp;printf(“%cn”, pp02);上述代码将输出一个字符t,以及换行。好了,到此为止我们完成了对二次指针的分析。在文章动态分配二维数组(或动态分配二维数组)当中,给出了利用二次指针动态分配二维数组的代码样例。以及内存分配的示意图。通过分析该文章的代码和配图,有助于我们更深入的理解二次指针。而我们也需要在心中牢记的,是二次指针与二维数组名之间的

7、区别。它们是完全不同的两种数据类型。在编程时,都可以通过类似*(*(p + 2) + 3)、p23的方式来访问一个具体的数组元素。但是他们在计算上述表达式以获取数据时,进行的操作是不一样的。总之,这种表达形式上的一致性有利于我们进行编程,但同时也是让我们对他们的区别感到迷惑的根源所在。C语言中,二维数组名与二次指针之间的关系着实令人头疼。在进入下一步的讨论之前,先举例说明一下什么是二维数组名和二次指针。 char a258;上述代码中,a2是一个二维数组名,而p2则是一个二次指针(指向指针的指针)这两个概念之间错综复杂的关系之所以令人头疼,我以为主要来自以下两个方面。其一是一维数组名与指针之间

8、的对应关系,多少让人对二维数组与二次指针之间的关系产生亦真亦幻的遐想。事实上,二维数组与二次指针之间没有关系,尝试编译以下代码你就知道这个想法不靠谱了: char a58;char *p;p = a; /cannot convert from 'char 58' to 'char * '编译这段代码,将得到一个提示为“cannot convert from 'char 58' to 'char * '”的错误。意思是a和p的类型不一样,而且无法实现隐式转换。在这句提示中,最让人头疼和摸不着头脑的,莫过于char 58了,这是什么鬼东西?另一个让人对二维数组与二次指针之间对应关系感到迷糊的,还在于我们确实可以通过二次指针来实现一个二维数组,也能像访问二维数组元素一样通过下标索引的方式访问二次指针指向的指向的内存空间。具体的方法可参考这篇文章:动态分配二维数组(或动态分配二维数组)。从这篇文章的代码

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论