04 指针和数组.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
这里的目的是先提一下,给学生一个初步印象,以后在使用多线程时,再举例细讲,不至于太突兀。 * 在VC环境内给学员演示 * 在课堂上举例说明 * 伴随提问讲解 * 伴随提问讲解 * 伴随提问讲解 * 伴随提问讲解 * 伴随提问讲解 * 让学员解释该程序的运行原理 * * * 请在课堂上举例讲解 * * * 提问学生,能否编译通过?如果编译通过运行会有什么问题? * 运算符的优先级(precedence)和结合律(associativity)决定操作数的结合方式。当复合表达式中的运算符的优先级不同时,操作数的结合方式由优先级决定。当复合表达式中的运算符的优先级相同时,操作数的结合方式由结合律决定。不过,我们也可以使用括号强制把操作数结合在一起。例如: ? ?? ???(3 + 2) * 5 强制把 3 和 2 结合在一起。 * 如下声明 int *v1; 优先级相同,应该从右向左读 v1 是一个引用, 它引用一个指针,指针指向 int 型的对象。 * * 数组是一块连续的内存 * * 这里k前面有4,因为类型是int * 原PPT有误,原先内容为char[2],讲课的时候予以更正 * * 这里k前面有4,因为类型是int * 这里k前面有4,因为类型是int * 这里k前面有4,因为类型是int * 这里k前面有4,因为类型是int 指向数组的指针 上面的定义中加上初始化后是下面这个样子: int (*p)[5] = Matrix; // int Matrix[3][5]; 它使p指向Matrix的第一行。那么p[1]就指向第二行,p[4]指向Matrix的最后一行,所以我们可以使用这个指针一行一行地在Matrix中移动。 如果需要使用指针p逐个访问整形元素而不是逐行在数组中移动,应该怎么办呢? 指向数组的指针 p首先是个指针,那么就可以使用下标访问,它又指向整形数组,因此,可以这样访问: p[0][0]=1; p[1][2]=10; //….. 指向数组的指针 对于: int (*p)[5]; 关于p[1][2],首先p[1]代表一个int[5]类型的数组,如果p指向地址X,那么p[1]就指向(X+5*4),既然p[1]是int[5]类型,那么p[1][2]的地址就是(X+5*4)+2*4,就是说与二维数组的计算完全一样。 从另外一个角度 ,p是int[5]类型的指针,那么p的步长是int[5]。 多维数组和数组指针 同理我们对应到更多维的数组和数组指针。如: int array2[2][3][5]; int (*array1)[3][5]; array1[]的类型是int[3][5],array1[][]的类型是int[5],所以, array1[]的步长是3*5*4 = 60。 array1[2][0][1]的地址是 (2*60+5*0+1*4) 由此我们看出数组指针中元素的访问方式和对应的多维数组的访问方式完全一致. 目录 数组 指针 数组和指针 一维数组和一级指针 数组指针和多维数组 多级指针和多维数组的关系 指向指针的指针 我们先看一下什么是指向指针的指针: int a = 12; int* b = a; int** c = b; 其中,变量c是一个指向指针的指针。b存储的是a的地址,c存储的是指针b的地址。可以叫做二级指针 我们还可以继续定义: int*** d = c; 那么,d存储的是二级指针c的地址。可以叫做三级指针。 指向指针的指针 尽管超过两级的多级指针很罕见,但在两种情况下,确实会看到指向指针的指针: 当我们声明一个指针数组时: Shape *picture[MAX] ; //这是一个数组,其元素为指向Shape的指针。 由于数组的名字会退化为指向其第一个元素的指针,所以指针数组的名字也是一个指向指针的指针(主要出现在函数的参数中): Shape** pic = picture; 指向指针的指针 比如main函数的参数: int main(int argc, char **argv) 可以写成: int main(int argc, char *argv[ ]) 指向指针的指针可能会很复杂,最好将其隐藏起来,所以在main的参数中我们使用指针数组,比使用二级指针更清晰、直观一些。 指向指针的指针 第二种情形就是 当一个函数需要改变传递给它的指针的值时(也就是地址值),例如下面的函数,它将一个指针移动到指向字符串中的下一个字符: void ScanTo(const char**p , char c) { while( **p **p!=c ) ++*p;

文档评论(0)

wxc6688 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档