一、指针数组及指向一维数组的指针(数组指针)讲解
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 <string.h>
#include <stdio.h>
#define N 4
#define M 50
char *fun(char (*q)[M])
{ int i; char *p;
p=*q;
for(i=0; i<N; i++)
if (strlen(p)<strlen(*(q+1)))
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 <string.h>
#include <stdio.h>
char *fun(char **q,int n)
{ int i; char *p1;
p1=*q;
for(i=0; i<n; i++)
if (strlen(p1)<strlen(*(q+i)))
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);
}
注意:①数组指针: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,%d\n",*a,*(a+1));
printf("%d,%d\n", a[0],a[1]);
printf("%d,%d\n",a,a+1);
printf("%d,%d\n",*b,*(b+1));
printf("%d,%d\n",**b,**(b+1));
printf("%d,%d\n",*(*b+1),*(*(b+1)+1));
printf("%d,%d\n",*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;
printf("%d,%d\n",*a,*(a+1));
printf("%d,%d\n", a[0],a[1]);
printf("%d,%d\n",*p1,*(p1+1));
printf("%d,%d\n", p1[0],p1[1]);
printf("%d,%d\n",a,a+1);
printf("%d,%d\n",p1,p1+1);
printf("%d,%d\n",*b,*(b+1));
printf("%d,%d\n",**b,**(b+1));
printf("%d,%d\n",*p2,*(p2+1));
printf("%d,%d\n",p2[0],p2[0]+1);
printf("%d,%d\n",**p2,**(p2+1));
printf("%d,%d\n",*(*b+1),*(*(b+1)+1)); printf("%d,%d\n",*(*p2+1),*(*(p2+1)+1));
printf("%d,%d\n",*b[0],*(b[0]+1));
printf("%d,%d\n",*p2[0],*(p2[0]+1)); getch();
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论