指针_计算机基础知识(编辑修改稿)内容摘要:

]; …… f( array,10); …… } void f (int arr[], int n ) { …… } 例 10.7 将数组a中n个整数按相反顺序存放。 main() { int a[10]={1,2,3,4,5,6,7,8,9,10}。 int i。 inv(a,10)。 for(i=0。 i10。 i++) printf(%3d,a[i])。 printf(\n)。 } void inv(int x[],int n) {int *i,*j。 int temp,m。 m=n/2。 i=x。 j=x+n1。 for(。 ix+m。 i++,j) {temp=*i。 *i=*j。 *j=temp。 } } 对刚才的程序可以作一些改动。 将函数 inv中的形参x改成指针变量。 void inv(int *x,int n) {int temp,*i,*j,m=(n1)/2。 i=x。 j=x+n1。 for(。 i=x+m。 i++,j) { temp=*i。 *i=*j。 *j=temp。 } } 如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下4种情况: (1) 形参和实参都用数组名,如: void main() void f ( int x [ ],int n) { int a[10] ; { … … f (a,10); } } (2) 实参用数组名,形参用指针变量。 如: void main() void f( int *x, int n) { int a[10]; { … … f(a,10); } } (3)实参形参都用指针变量。 例如: void main() void f( int *x, int n) { int a[10] , *p=a。 { … … f( p,10); } } (4) 实参为指针变量,形参为数组名。 如: void main() void f( int x[ ], int n) {int a[10] ,*p=a; { … … f( p,10); } } 例 从 10个数中找出其中的最大值和最小值 int max,min。 void max_min(int array[],int n) { int *p,*array_end。 max=min=*array。 array_end=array+n。 for(p=array+1。 parray_end。 p++) if(*pmax) max=*p。 else if (*pmin) min=*p。 } main() { int a[10]={6,7,8,1,2,3,4,5,9,10}。 max_min(a,10)。 printf(max=%3d,min=%3d\n,max,min)。 } 多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。 但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 复习一维数组与指针之间的关系 int a[10],*p。 p =a。 p =amp。 a[i]==a+i。 *p=*(a+i)==a[i]。 p p+i …… a 1. 多维数组元素的地址 先回顾一下多维数组的性质 ,可以认为二维数组是“数组的数组”,例 : 定义 int a[ 3][ 4] ={{1, 3, 5, 7},{9,11,13,15},{17,19,21,23} }; 则二维数组 a是由 3个一维数组所组成的。 a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[0] a[1] a[2] a a+1 a+2 a+i == amp。 a[i] (1)a,a+1,a+2分别代表 amp。 a[0],amp。 a[1],amp。 a[2] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[0] a[1] a[2] a+i == amp。 a[i] (2)a[0],a[1],a[2]分别代表 amp。 a[0][0],amp。 a[1][0],amp。 a[2][0] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[0] a[1] a[2] a a+1 a+2 a+i == amp。 a[i] a[2]+1,a[2]+2分别代表 amp。 a[2][1],amp。 a[2][2] a[i]+j (3)amp。 a[i][j] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[0] a[1] a[2] a a+1 a+2 a+i == amp。 a[i] *(a+i)+j amp。 a[i][j] *(a+i) == a[i] a[i]+j a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[0] a[1] a[2] a a+1 a+2 a+i == amp。 a[i] *(a+i)+j (4)amp。 a[i][j] *(a+i) == a[i] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[0] a[1] a[2] a a+1 a+2 a+i == amp。 a[i] *(*(a+i)+j) (5)*(amp。 a[i][j]) *(a+i) == a[i] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[0] a[1] a[2] a a+1 a+2 a+i == amp。 a[i] *(*(a+i)+j) (5) a[i][j] *(a+i) == a[i] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[0] a[1] a[2] a a+1 a+2 a+i与 *(a+i)有什么区别 ? 小结 (1)a,a+1,a+2分别代表 amp。 a[0],amp。 a[1],amp。 a[2] (2)a[0],a[1],a[2]分别代表 amp。 a[0][0],amp。 a[1][0],amp。 a[2][0] (3) a[i]+j 代表 amp。 a[i][j] (4) *(a+i)+j代表 amp。 a[i][j] (5)*(*(a+i)+j)代表 a[i][j] a[i]从形式上看是一维数组的第 i个分量 ,但当 a为二维数组时 ,a[i]只代表一个地址 (1)用指针变量输出数组元素的值 main() {int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}。 int *p。 //printf(%o\n%o\n%o\n%o\n,a,a[0],amp。 a[0],amp。 a[0][0])。 for(p=a[0]。 pa[0]+12。 p++) {if ((pa[0])%4==0) printf(\n)。 printf(%4d,*p)。 } } 用普通的指针变量输出数据元素时 ,要先二维数组序列化为一维 ,然后再输出 .接下来定义提向一维数组的指针变量 . (2)指向一维数组的指针变量 指向一维数组的指针变量的声明形式: int (*p)[4]。 p可以指向由四个分量组成的一维数组 ,p每次 +1,移动的单元数是一维数组所。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。