- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
c语言(第九章)指针
9.1 地址和指针的概念 正确灵活的运用指针 可以有效表示复杂的数据结构 能动态分配内存 方便使用字符串 方便有效的使用数组 调用函数时可以得到多个值 能直接处理内存地址 9.1 地址和指针的概念 数据在内存中是如何存取的? 例:在程序中定义了一个变量,在编译时给这个变量分配内存单元,根据定义的变量类型,分配一定长度空间 内存中的每一个字节有一个编号,这就是地址,在地址所标志的内存单元中存放数据 9.2 变量的指针和指向变量的指针变量 变量的指针就是变量的地址,存放变量地址的变量是指针变量,用来指向另一个变量。 为了表示指针变量和它所指向的变量之间的关系,在程序中用*符号来表示“指向” 指针变量不同于其他类型的变量,它专门用来存放地址,必须将它定义为”指针类型“ 为什么要指定类型名 如果指针指向的是一个整型变量,那么指针加1就意味着地址值两个字节,如果是指向一个实型变量,则增加的应该是4个字节,所以一个指针变量只能指向同一个类型的变量 int a[10]; int *p; 下面两个语句等价: p=a[0]; p=a; 在定义的时候也可以赋初值 int *p=a[0]; 说明: p+i和a+i就是a[i]的地址,他们都是指向a数组的第i+1个元素 *(p+i)或*(a+i)是p+i或a+i所指向的数组元素 指向数组的指针变量也可以带下标如: p[i]和*(p+i)是等价的 要注意指针变量的当前值,在使用指针变量指向数组的时候,应切实保证指向数组中有效的元素 注意指针变量的运算: p++,使p指向下一个元素 *p++,由于++和*同优先级,结合方向为自右而左,因此它等价于*(p++),作用是先得到p指向的变量的值即*p,然后再使p+1=p *(++p)使p加1,再取*p (*p)++表示p所指向的元素加1。是元素值加1,不是指针值加1 例:将数组中n个整数按相反的顺序存放 void inv(int x[],int n) /*形参x为数组名*/ {int temp,i,j,m=(n-1)/2; for(i=0;i=m;i++) {j=n-1-i; temp=x[i]; x[i]=x[j]; x[j]=temp; } } void inv(int *x,int n) /*形参x为指针变量*/ {int *p,temp,*i,*j,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i++,j--) {temp=*i; *i=*j; *j=temp; } } 例:从10个数中找出其中的最大值和最小值 不要求改变数组元素的值,只是找到最大和最小值,为了能得到两个结果,我们用两个全局变量在函数间传递数据 函数max_min_value的形参array可以改为指针变量类型; void max_min_value(int *array,int n) 实参也可以不用数组名,而用指针变量传递地址,形参仍用指针变量 总结: 若一个实参数组,想在函数中改变此数组元素的值,实参和形参的表示形式有以下4种情况: 第一种情况: 形参和实参都用数组名: 形参和实参数组共用同一段内存单元 第二种情况: 实参用数组名,形参用指针变量 通过形参的变化就可以指向实参数组的任何一个元素 第三种情况: 实参形参都用指针变量 传递指针变量的值,其实就是数组的首地址,通过形参指针的变化指向数组的任一元素,从而改变数组的值 第四种情况: 实参为指针变量,形参为数组名 将数组的首地址传给形参指针,形参指针指向数组的首元素 以上的四种方法,实质上都是地址的传递,1和4只是形式上的不同,实质上都是使用的指针变量 注意:如果使用指针变量作实参,必须先使指针变量有确定值,指向一个已定义的数组!如果不设数组,只设指针变量,就会出错。 指向二维数组的指针和指针变量 一、多维数组的地址 int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; a是一个数组名,a数组名包含3行,即三个元素:a[0],a[1],a[2].而每一个元素又是一个一维数组 a[0]: a[0][0] a[0][1] a[0][2] a[1]: a[1][0] a[1][1] a[1][2] a[2]: a[2][0] a[2][1] a[2][2] 指向二维数组的指针和指针变量 从二维数组的角度来看,a代表整个二维数组的地址,也就是0行的首地址,a+1代表第1行的首地址,也就是a[1]的地址 a[0]代表第0行一维数组第0列元素的地址,即a[
文档评论(0)