二维数组
其概念方法和 @一维数组 类似 例如
定义一个二维数组
int str[3][6];
第一维有3个元素 第二维有6个元素 每一维用花括号括起来。
二维数组的含义
int str[3][6];
定义一个str指向的类型是 int 的 数组变量 并且具有三行六列的元素大小
也就是说 一行有六列 一共有三行 18个元素大小
二维数组的初始化方式
(1)分行对二维数组初始化赋值
int str[3][6]= {{1,2,3,4,5,6},
{7,8,9,10,11,12,13},
{14,15,16,17,18,19}
};
这种方法比较直观 第一个花括号的元素给第一行 第二个花括号的元素给第二行 … 就是这样赋值
(2)可以将所有元素就用一个花括号括起来 系统会根据你定义的数组行数列数进行平均分配
int str[3][6]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
(3)对部分赋值 没赋值的自动补o
int str[3][6]={{1},{5},{2}};
赋值过程
1 0 0 0 0 0
5 0 0 0 0 0
2 0 0 0 0 0
(4)全部赋值为0
int str[3][6]={0};
也就是全部元素都为0了
二维数组的访问方式
访问的格式 数组名[i][j];i和j 都是从零开始算的
也就是我们所说的下标法访问
二维数组的引用
#include <stdio.h>
void main(void) //定义一个无参无返回类型主函数
{
int str[3][6]= {{1,2,3,4,5,6},
{7,8,9,10,11,12,13},
{14,15,16,17,18,19}
};
printf(“访问第1行第1列对应的元素%d\n”,str[0][0]);
printf(“访问第1行第2列对应的元素%d\n”,str[0][1]);
printf(“访问第1行第3列对应的元素%d\n”,str[0][2]);
printf(“访问第1行第4列对应的元素%d\n”,str[0][3]);
}
二维数组的访问注意事项
访问的时候 以上的例子为参考 并不会访问到arr[3][6]的元素 因为我们从0开始访问元素的
指针变量
定义一个指针变量 @指针变量
int *p;//定义一个指针变量 指针指向int类型 是一个int类型的指针变量
P=NULL;//向左赋值给指针 初始化指针
数组指针
能不能定义一个指针,让指针偏移的时候 也同等于数组名偏移得到同样对应的数组元素大小
二维数组名的偏移 也就是 行的偏移 @数组名 行名 列名 三个的联系
代码演示
#include<stdio.h>
//0行0列是一个地址 0行1列也是个地址 每个地址都是 int类型
void main(void)
{
int arr[2][2]={{12,13},{14,15}};
printf("首行地址%p\n",arr[0]);
printf("第2行地址%p\n",arr[1]);
}
运行结果
用行首地址 和偏移了一行的地址 对比 为什么会产生这样结果
因为 0行0列是一个地址 0行1列也是个地址 每个地址都是 int类型 并且定义了 一行有两个元素 所以是 偏移了 2*4个字节
数组加入指针变量
#include<stdio.h>
//0行0列是一个地址 0行1列也是个地址 每个地址都是 int类型
void main(void)
{
int arr[2][2]={{12,13},{14,15}};
int (*p)[2];
p=arr;
printf("首行地址%p\n",arr[0]);
printf("第2行地址%p\n",arr[1]);
printf("*********************************");
printf("指针首地址%p\n",p);
printf("指针偏移地址%p\n",++p);
}
运行结果
出奇一致 为什么呢
首先 0061FF0C +2*4 =0061FF14
加的过程 +DEF01234 刚刚好 2*4个字节
(出现的原因)特别注意
通过上面两个例子 我们可以知道 数组指针是名副其其实意义上等同于维数组名的
当数组名偏移 就是行名偏移 等效于数组指针中的 指针偏移