您的位置:首页 > 其它

对于数组和指针的理解

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

一、一维数组

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]
,则该数组有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]
中,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]出元素的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: