一维数组

数组的创建

数组是一组相同类型元素的集合。

创建方式:

1
2
3
type_	arr_name	[const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小

整型数组的初始化

1
2
3
4
int a =10;//初始化
int arr[10] = {1,2,3,4,5,6,7,8,9,10}//完全初始化
int arr[10] = {1,2,3,4,5} //不完全初始化,没有被初始化的自动用0代替
int arr2[] = {1,2,3,4,5} //根据初始化的内容来确定数组元素个数

字符数组的初始化

1
2
3
4
5
6
7
8
9
10
11
12
char ch[5] = {'b','i','t'};			//用单引号依次存放
char ch2[] = {'b','i','t'};
char ch3[5] = "bit";//元素 b i t \0
char ch4[] = "bit";//b i t \0
char ch5[] = "bit";
//b i t \0 四个元素
char ch6[] = {'b','i','t'};
//b i t 三个元素
printf("%s\n",ch5);//bit //有\0终止符
printf("&s\n",ch6);//bit烫烫烫it //没有\0,直到在内存中找到下一个\0才会停止
printf("%d\n",strlen(ch5));//3
printf("%d\n",strlen(ch6));//随机值

一维数组的使用

对于数组的使用,之前介绍了一个操作符:[],下标引用操作符。

1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
int arr[10] = {0};
arr[4] = 5;//[]-下标引用操作符 //给第五个元素赋值为5
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//整个数组的大小/第一个元素的大小=数组的个数
for (i=0;i<sz;i++)
{
printf("%d",arr[i]);
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
printf("%x\n",0x12);//12
printf("%p\n",0x12);//00000012
int arr[10] = {0};
int i = 0;
for (i=0;i<10;i++)
{
printf("&arr[%d] = %p\n",i,&arr[i]);//%p是按地址的格式打印-十六进制的打印
}
return 0;
}

结果是

1
2
3
4
5
6
7
8
9
10
&arr[0] = 012FFDA8
&arr[1] = 012FFDAC
&arr[2] = 012FFDB0
&arr[3] = 012FFDB4
&arr[4] = 012FFDB8
&arr[5] = 012FFDBC
&arr[6] = 012FFDC0
&arr[7] = 012FFDC4
&arr[8] = 012FFDC8
&arr[9] = 012FFDCC

每个都相差4,是因为每个整形元素的大小是4字节因此每个元素相差4个地址编号

因此我们可以得知,一维数组是在内存中连续存放的!并且随着数组下标的增长,地址是由低到高变化的!

1
2
3
4
5
6
7
8
9
10
11
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,1o};
int*p = arr;//数组名是数组首元素的地址
for(i=0;i<10;i++)
{
printf("%d",*p);
p++;//逐渐打印之后的元素
}
return 0;
}

二维数组

二维数组的创建和初始化

1
2
3
//创建数组
int arr[3][4];
char ch[3][10];

二维数组可以看作成一个个表格形成的矩阵(大中方确信)

1
2
3
4
//数组的初始化-创建的同时给与赋值
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//给每个数组都赋值
int arr[3][4] = {1,2,3,4,5,6,7};//不完全初始化,后面补0,字符数组补充'\0'
int arr[3][4] = {{1,2},{3,4},{5,6}};

二维数组的省略

1
2
3
int arr[][] = {{1,2},{3,4},{5,6}};//err
int arr[3][] = {{1,2},{3,4},{5,6}};//err
int arr[][4] = {{1,2},{3,4},{5,6}};//成功运行

上面的例子可以说明,二维数组,行数可以省略但是列不能省略。

二维数组的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main()
{
int arr[][4] = {{1,2},{3,4},{5,6}};
int i=0;
int j=0;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d",arr[i][j]);
}
printf("\n");
}
return 0;
}

二维数组在内存中的存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main()
{
int arr[][4] = {{1,2},{3,4},{5,6}};
int i=0;
int j=0;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("&arr[%d][%d]=%p\n",i,j,&arr[i][j]);
}
printf("\n");
}
return 0;
}

通过二维数组的地址可以知道,相邻两个二维数组相差4个字节(一个整型),并且二维数组在内存中是连续存放的,换行业是连续存放的。

因此通过地址也可以解释之前的,为什么列可以省略但是行不行,原因行是确定一行当中有几个元素,但是当其不确定时,就不知道应从何开始,又从何结束。

而当我们知道了一个数组的地址我们就可以随意调用其他数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main()
{
int i=0;
int j=0;
int arr[][4] = {{1,2},{3,4},{5,6}};
int *p = &arr[0][0];
for(i=0;i<12;i++)
{
printf("%d",*p);
p++;
}
return 0;
}