指针数组及指向一维数组的指针讲解

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、指针数组及指向一维数组的指针(数组指针)讲解

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

#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);

}

注意:①数组指针: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;

相关文档
最新文档