对于数组和指针的理解

首先介绍一下数组,实际程序过程中接触到较多的应该就是一维数组和二维数组了,那么这两个数组如何去理解运用呢?

一、一维数组

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]出元素的值。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值