二维数组与指针
一,二维数组
1,二维数组的概念
二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。也可以理解为一维数组中的数组,二维数组中的元素也就是一维数组中的元素。
2,二维数组的定义
类型说明符: 数组名[常量表达式][常量表达式]。
3,二维数组的使用
4,二维数组的初始化
按照一维数组的顺序依次进行初始化,可以部分初始化(没被初始化的元素默认为0),也可以进行全部初始化。
4.1,指定二维数组的大小
举例说明:
#include<stdio.h>
int main()
{
float buf1[2][3]={1,2,3,4,5,6}; //全部初始化
float buf2[3][4]={8,9,7,6,5}; //部分初始化
for(int a=0;a<2;a++)
{
for(int b=0;b<3;b++)
{
printf("%f ",buf1[a][b]);
}
printf("\n");
}
printf("二维数组的全部初始化\n");
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("%f ",buf2[i][j]);
}
printf("\n");
}
printf("二维数组的部分初始化\n");
}
4.2,不指定二维数组的大小
举例说明:
#include<stdio.h>
int main()
{
float buf1[][3]={1,2,3,4,5,6};
float buf2[][4]={{1},{2},{3,3},{4}};
printf("buf1 size is %ld",sizeof(buf1));
printf("buf2 size is %ld",sizeof(buf2));
}
二,二维数组与指针
⼆维数组的数组名就是整个数组的⾸地址(数组中的第0个元素的地 址)
对于二位数组而言,二位数组的地址就是一维数组的地址。
当 数组名 +1 :表⽰移动一个⼆维数组的元素(⼀维数组)的⼤⼩地址
当 数组名[数组元素] + 1:表⽰移动一个⼀维数组的元素(普通数据)的⼤⼩地址
*数组名=*(&数组名[数组元素])代表的含义就是:取函数值
//二维数组与指针
#include<stdio.h>
int main()
{
int buf[3][4]={{1,2,3,4},{5,6,7,8},{9,10}};
int *p;
p = buf[1]; //代表的含义是:变量p等于数组下标索引为1的这个整个一维数组,即:a[1][4]
printf("%d %d\n",*p,*(buf[1]+0)); //*p and *(buf[1]+0) 都表示取数组元素buf[1]的值
printf("%d %d\n",*(p+2),*(buf[1]+2)); //*(p+2) and *(buf[1]+2) 都表示数组中下标为2的值
}
三,数组指针
1,概念
是⼀个指针,存储地址,⽤于存储整个数组的地址,指针的类型为数组地址 类型,指向整个数组
2,定义
数组元素类型 (* 指针名) [数组⼤⼩]
举例说明: int (*p) [5] 代表着定义了整型的,数组大小为5的数组指针。
3,实例示范
#include<stdio.h>
int main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10}};
int (*p)[4]; //数组指针的定义,表示定义一个存储整型的数组元素为四的地址
p=a; //代表存储a[0]这个一维数组的地址。它等价于 *p
p+1; //代表的含义为存储一维数组下标索引为1的地址。 它等价于 *(p+1)
**p; //代表着二维数组a[0][0]的地址中存储的值。
*(*(p+1)); //代表着二维数组a[1][0]的地址中存储的值。
*(*(p+1)+1); //代表着二维数组a[1][1]的地址中存储的值。
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("%d ", *(*(p+i)+j) );
}
printf("\n");
}
}
四,指针数组
1,概念
指针数组就是⼀个数组,但是数组的每个元素是⼀个指针。
2,定义
数据类型 * 数组名 [数组⼤⼩]
例如:int * a [10]
3,举例说明
#include<stdio.h>
int main()
{
int a=1,b=2,c=3,d=4;
int buf[10]={1,2,3,4,5,6,7,8,9,10};
int *p[4]; //代表着定义了一个整型的指针数组
p[0]=&a; //代表存储a的地址
p[1]=&b;
p[2]=buf; //代表存储数组中首地址
p[3]=buf+2; //代表存储数组下标为4的地址;
*p[0]=5;
*p[1]=7;
*(p[2]+2)=10;
*p[3]=12;
for(int j=0;j<10;j++)
{
printf("%d ", buf[j] );
}
printf("\n");
}
五,多级指针
1,概念
指针变量是存储地址的,但是由于指针变量本身也要占用空间,所以指针变量也会有地址,倘若另外的指针变量存储的是这个指针变量的地址,把另外的指针变量叫做二级指针。
多级指针:
⼀级指针变量存普通数据类型的地址,
⼆级指针变量存⼀级指针变量的地址,
三级指针变量存⼆级指针变量的地址
2,定义
int * p1;
pi = &a; //p1存储的是a的地址。
int * *p2 = & p1; //p2存储的是p1的地址。
int * * *p3 = &p2; //p3存储的是p2的地址也就是存储的p1的地址。