首先介绍一下数组,实际程序过程中接触到较多的应该就是一维数组和二维数组了,那么这两个数组如何去理解运用呢?
一、一维数组
1、一维数组的表示
int a[3]={1,2,3};
int a[]={1,2,3};//两种定义均可
2、一维数组名的含义
如上定义的数组名a表示的是a数组中的首地址
#include<stdio.h>
void main()
{
int a[3]={1,2,3};
int *p;
p=a; //由于数组名称即代表首元素地址,因此无需加取地址符&
printf("%p\n",p); //输出p指向的数组a的首元素地址
}
二、二维数组
1、二维数组的表示
int a[2][2]={1,2,3,4};//还有其他方法也可表示
2、二维数组名的含义
由于二维数组存储在内存空间中为连续存储,即按照数组a[0][0]到a[1][1]是连续的。
假设二维数组定义为a[m][n],则该数组有m个行数组,由以上推导,数组名表示数组首元素的地址,那么二维数组名表示什么呢?
其实,二维数组名a代表是二维数组中首个行数组,a+1代表的是下一个行地址,以此类推
行数组其实就是一维数组,a[0]代表的是第一行的行数组,a[1]代表的是第二行的首地址,都是一维数组,以此类推。那么既然a[0]代表的是一维数组,数组名即是数组的首元素的地址,所以a[0]代表的是第一行中首元素的地址。
#include<stdio.h>
void main()
{
int a[3][2]={1,2,3,4,5,6};
int *p;
p=a[0]; //a[0]即代表数组首行数组中首元素的地址
printf("%p\n",p); //输出指针指向的地址值
}
#include<stdio.h>
void main()
{
int a[3][2]={1,2,3,4,5,6};
int (*p)[2]; //该段定义了一个数组指针,即二维数组中常用的行指针
p=a; //a即为首行数组的地址值
printf("%p\n",p); //两端程序输出结果相同
}
三、与数组有关的指针
1、一维数组的指针定义与调用
#include<stdio.h>
void main()
{
int a[]={1,2,3};
int *p,i=0;
p=a;
for(i=0;i<3;i++)
printf("the num is:%d\n",p[i]);//或者改成*(p+i)也可输出同样效果
}
2、二维数组的指针定义与使用
#include<stdio.h>
void main()
{
int a[3][2]={1,2,3,4,5,6}; //定义二维指针时一定要有列数
int *p,i=0,j=0;
p=&a[0][0]; //p=a[0]效果相同
for(i=0;i<3;i++,p++)
// for(j=0;j<2;j++)
printf("the num is:%d\n",*p);
}
3、关于行指针的使用
C语言中常用行指针进行传参,在了解行指针之前,我们先了解一下什么是数组指针指针数组
首先用英文会理解得更加直观
1、数组指针(a pointer to an array)
int a[2][3]={1,2,3,4,5,6};
int (*p)[3]; //[]运算符优先于*运算符,因此需要加括号,代表p是一个指针,指向一个有三个元素的数组,也就是常用的行指针
p=a; //即p指向a数组的第一行
2、指针数组(a array of pointer)
#include<stdio.h>
void main()
{
int a[3][2]={1,2,3,4,5,6}; //定义二维指针时一定要有列数
int i=0,j=0;
int *p[3]; //定义了一个指针数组
p[0]=a[0];
p[1]=a[1];
p[2]=a[2];
for(i=0;i<3;i++)
printf("the num is:%d\n",*p[i]);
}
3、重点理解部分
二维数组中a[m][n]中,a代表了第一个行数组的首地址,由于a并未降级为一维数组,所以*a仍表示为第一个行数组的首地址,a+i代表偏移i行;
a[0],a[1]等已经降级为一维的行数组,所以a[0]代表的是0行第一个元素的地址,*(a[0])表示的是a[0][0]的值,定义一个指针p,*(p[0]+1)或者是*(*(p+i)+j)代表的是a[i][j]出元素的值。