admin 管理员组文章数量: 887021
2023年12月24日发(作者:index html是什么)
一、指针数组及指向一维数组的指针(数组指针)讲解
1、数组指针(也称行指针)
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4];
//该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a;
//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++;
//该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
所以数组指针也称指向一维数组的指针,亦称行指针。
2、指针数组
定义 int *p[n];
[]优先级高,先与p结合成为一个数组,再由int *说明这是一个整型指针数组,它有n个指针类型的数组元素。这样赋值是错误的:p=a;只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
for(i=0;i<3;i++)
p[i]=a[i];
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]所以要分别赋值。
这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。
比如要表示数组中i行j列一个元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]
优先级:()>[]>*
例1、下列给定程序中,函数fun()的功能是:从N个字符串中找出最长的那个串,并将其地址作为函数值返回。
#include
#include
#define N 4
1
#define M 50
char *fun(char (*q)[M])
{ int i; char *p;
p=*q;
for(i=0; i if (strlen(p) q=*(q+1); return p; } main( ) { char str[N][M]={“pingpong”,”basketball”, ”field hockey”,”softball”}; char *longest; int i; longest=fun(str); printf(“nThe longest string:n”); puts(longest); } 例2、下列给定程序中,函数fun()的功能是:从N个字符串中找出最长的那个串,并将其地址作为函数值返回。 #include #include char *fun(char **q,int n) { int i; char *p1; p1=*q; for(i=0; i if (strlen(p1) p1=*(q+i); return p1; } main( ) { char *p[]={“pingpong”,”basketball”, ”field hockey”,”softball”}; char *longest; int i; longest=fun(p,4); printf(“nThe longest string:n”); puts(longest); 2 } 注意:①数组指针:int (*p)[4]; p适应于指向二维数组的数组名,类型匹配。也就是说二维数组名作为函数的实参时,形参必须定义为数组指针。 ②指针数组:int *p[4]; 指针数组名作为函数的实参时,形参必须定义为指向指针的指针。这样类型才匹配。 二、一维数组名与二维数组名的区别 定义的时候一维数组名有一个[],而二维数组名有两个。如一维数组a[N],二维数组a[N][N].对于一维数组a[N]来说,a(或者&a[0])就是数组首地址(即a[0]的地址),a+1就是a[1]的地址。而对于二维数组a[][]来说,a(或者a[0]或者&a[0][0])是它的首地址,a+1(或者a[1]或者&a[1][0])就是a[1][0]的地址。但要注意对于二维数组a[][]来说,虽然a(或者a[0]或者&a[0][0])是它的首地址,但a和a[0]的指向是不同的,也就是指针类型不一样,a[0]是竖指针,而a是横指针。 例3、写出下面程序输出的结果: main() {int a[4]={1,2,3,4},b[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; printf("%d,%dn",*a,*(a+1)); printf("%d,%dn", a[0],a[1]); printf("%d,%dn",a,a+1); printf("%d,%dn",*b,*(b+1)); printf("%d,%dn",**b,**(b+1)); printf("%d,%dn",*(*b+1),*(*(b+1)+1)); printf("%d,%dn",*b[0],*(b[0]+1)); getch(); } 例4、写出下面程序输出的结果: main() {int *p1,(*p2)[4],a[4]={1,2,3,4},b[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; p1=a; p2=b; 3 printf("%d,%dn",*a,*(a+1)); printf("%d,%dn", a[0],a[1]); printf("%d,%dn",*p1,*(p1+1)); printf("%d,%dn", p1[0],p1[1]); printf("%d,%dn",a,a+1); printf("%d,%dn",p1,p1+1); printf("%d,%dn",*b,*(b+1)); printf("%d,%dn",**b,**(b+1)); printf("%d,%dn",*p2,*(p2+1)); printf("%d,%dn",p2[0],p2[0]+1); printf("%d,%dn",**p2,**(p2+1)); printf("%d,%dn",*(*b+1),*(*(b+1)+1)); printf("%d,%dn",*(*p2+1),*(*(p2+1)+1)); printf("%d,%dn",*b[0],*(b[0]+1)); printf("%d,%dn",*p2[0],*(p2[0]+1)); getch(); } 4
版权声明:本文标题:指针数组及指向一维数组的指针讲解 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1703378164h448725.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论