任务代码:
(1)用指向二维数组元素的指针:
#include <stdio.h>
int main( )
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p;
for(p=a[0];p<a[0]+12;p++)
{
printf("%3d ",*p);
}
return 0;
}
(2)数组指针:指向一维数组的指针变量
#include <stdio.h>
int main( )
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int i,j,(*p)[4];//定义一个指向有四个元素的一维数组的指针
for(p=a,i=0;i<3;i++,p++) //i用于计算行数
{
for(j=0;j<4;j++)
{
printf("%3d ",*(*p+j));//!!尤其注意,这里的p存储的是a行整体的地址指向一维数组a[0]整体,而不是指向一个具体的值!
//*p的值取出来的值就是a[0][0]的地址,*p+j就是存储a[0][j]行的地址,
// *(*p+j)就是该地址指向的元素的值!!
}
printf("\n");
}
return 0;
}
第二种写法:(含义不同)
#include <stdio.h>
int main( )
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int i,j,(*p)[4];
p=a[0];//p存储a[0]行整体的地址,*p指向a[0]一维数组整体
for(i=0;i<3;i++) //i用于计算行数
{
for(j=0;j<4;j++)
{
printf("%3d ",*(*(p+i)+j));//p指向一维数组整体,(p+i)代表指向每一行的一维数组,
//*(p+i)取值代表每一行一维数组第a[i][0]个元素的地址
//*(p+i)+j代表每一行a[i][j]的地址
//*(*(p+i)+j)代表a[i][j]的值
}
printf("\n");
}
return 0;
}
(3)指针数组:
#include <stdio.h>
int main( )
{
int b[2][3]={{1,2,3},{2,4,6}};
int *pb[2];
int i,j;
pb[0]=b[0];//pb[0]存储b[0]行一维数组首元素b[0][0]地址,*pb指向b[0]首元素
pb[1]=b[1];//pb[1]存储b[1]行一维数组首元素b[1][1]地址,*pb指向b[1]首元素
for(i=0;i<2;i++)//用于记录行数
{
for(j=0;j<3;j++,pb[i]++)//pb[i]++代表在b[i]行的基础下,访问b[i][j]元素的值
{
printf("%2d ",*pb[i]);
}
}
return 0;
}
知识总结:
(1)用指向二维数组元素的指针:
(2)数组指针:指向一维数组的指针变量!
数组指针是一个指针,但是指向的不是一个元素,而是指向一维数组整体!
例子1(第一种写法):
例子2(第二种写法):
(3)指针数组:(注意区别与数组指针的不同)
指针数组去访问二维数组;