一维
- 什么是数组
就是一组数
官方:一组相同类型的元素的集合
int a = 1;
int b = 2;
太繁琐
创建一个空间一次能放一组数 - 一维数组的创建与初始化
arr name数组名
数组元素类型
对应语法写一个数组
arr[8];放八个元素
八个什么类型的;int
每个元素的类型 char
[]里的一定是一个常量表达式
int n = 8;
int arr [ n];
n是个变量不允许
这个非常常见的一种错误
devc++的可以跑过去
c99语法支持变长数组-数组的大小是变量
vs2019不支持
gcc对c99支持的比较好
不知道支不支持就别用常量 - 初始化
int arr[10] = {1,2,3,4,5,5,6,7,78,};//完全初始化
int arr [10] = {1,2,3,4,5}//不完全初始化会是1234500000
int arr[] = ={1,2,3.4}它会根据后面的初始化内容来确定元素个数
字符数组
char ch[5] = {'b''i''t'};
还可以这样写
char arr3[5] = "bit";//b i t \0 0
char arr4[] = "bit"; //bit \0
最后一张图:区别两种写法的区别
第一个数组四个元素bit\0
第二个数组三个元素bit
通过打印可以看出区别
我们知道我要为内存里ch5分配空间
找了一个空间放了一个bit\0
你不知道前面后面拿到什么空间
但是你是从c开始,从左向右,遇到\0停止
第二个的时候打印出来,t后面是什么不知道,一直打印直到遇到\0
如果我们在这求长度strlen(ch5);bit就是3
但是strlen(ch6),没有遇到\0,一直往后找,是个随机值
请大家注意这个点
还要引头文件
devc++算的是3 - 一维数组的使用
- 下标引用操作符
int arr[10 ] = {0};这个表达式认为初始化第一个为0,后面也默认为0
int arr[10] = {0};
如果我们想给这个数组第五个元素放5就先去咋办;
潜规则:你创建了一个空间,那内存就给你分配了这个空间0也行
而且她的下标是0从9(数组下标从0开始)
arr[4] = 5;//这里[]是下标引用操作符
printf("%d,arr[4]);
我们把十个元素都打印出来
int i =0;
int sz = sizeof(arr) / sizeof(arr[0]);总数组大小40除以第一个元素的大小4就是这个数组的元素个数
for循环printf("%d",arr[i]);
- 一维数组在内存中的储存
我们怎么研究
我们把每个元素的地址打印出来
然后打印每个地址
%p是专门打印地址的-十六进制的打印
%x也是十六进制打印
但是地址是有长度的不能说12就是12,地址是二进制序列的吗
八个十六制数是因为
一个十六制进位要转换出来四个二进制位
所以8个十六制进位是把32个二进制位转换出来
32个二进制位是四个字节空间大小就是一个地址大小,所以就补了六个0
我们发现这样的结果
A8变成AC
十六进制中0-9 abcdef 1011121314
c是12 12和8差4
12加上4是16,逢16进一,A变成B
都差4,是因为每个整形元素的字节大小都是4
那这两个地址之间就差4,因为一个字节给一个地址
之间差了四个字节,即四个地址编号
我们可以判决两个东西
1.一维数组在内存中是连续存放的
2.随着数组下标的增长,地址是由低到高变化的!
有个这个基础,我们对于数组的访问更加容易
我们可以通过301找到303
我们知道第一个空间的地址就可以以后所有的空间地址
我们感受一下
数组名是数组首元素的地址
就是因为数组在内存中是连续存放的
- 下标引用操作符
二维
- 二维数组的创建和初始化
int arr[3] [4];
二维是有行和列
初始化的意思---创建的同时可以给赋值
int arr [3][4] = {1,2,3,4,54,6,7,76,7,6786};
不完成初始化--后面补0还可以
int arr [3] [4]= {{1,2},{2,3},{2,4}};
把某个值放在某一行就这样写
把它定义为三个一维数组
int arr [] [4]= {{1,2},{2,3},{2,4}};
行可以省略,列不能省略,你会发现依然有三行
因为里面包含了三个{},你有几行,会根据你初始化的情况来决定
- 二维数组的使用通过下标的方式
我们把它打印出来,就是下标法
语法规定:我们第一行是0,第一列也是0
我们确定一个元素,arr[1][2]
假设我们把所有元素打印出来
两个for循环arr[i][j]; - 二维数组在数组中的储存
我们不打印元素内容,打印每个元素的地址
%p打印打字
printf("&arr[%d][%d] = %p",i,j.&arr[i][j]);
结论:
二维数组在内存中也是连续存放的!不是行列图,看第二张图
一行内部连续,跨行也是连续!!才有每个差4
有什么用
int arr[] [4];
为什么4不可以省略
4是决定以一行有几个元素,只有确定一行有几个元素,才可以第二行放哪里去
行可以省略
因为只要列确定了,你就可以随便放,放完就行
我们如果拿到这个位置的地址,所有元素的地址就可以打印
int *p = &arr [0][0];把第一行第一个元素的地址拿出来
两个for循环
printf("%d",*p);
p++;
只有你知道内存的布局情况才能打印出来
增加对代码的理解
二维数组中明确知道,
我们访问他们arr[0][0]
我们可以看作一维数组
二维数组第一行数组名arr[0]