1. 数组的概念
简而言之,数组就是存放一组数据(相同类型的数据),可以是整型、字符型、浮点型等
//存放的都是整型的元素
int arr1[10];
//存放的都是字符型元素
char arr2[10];
//存放的都是浮点型元素
int float[10];
2. ⼀维数组的创建和初始化
2.1一维数组的创建
基本语法如下:
type arr_name[常量值];
2.2 一维数组的初始化
数组在创建的时候,我们需要给定⼀些初始值值,这种就称为初始化。
数组的初始化⼀般使⽤⼤括号,将数据放在⼤括号中。
2.2.1 完全初始化
//完全初始化
//10个元素都被赋予了初值
int aar[10]={1,2,3,4,5,6,7,8,9,10};
2.2.2不完全初始化
//不完全初始化
//前三个元素被初始化,其余初始化为0
int arr[10]={1,2,3};
此外,我们不能将数组初始化的个数大于所设定的数组个数,这是错误的,编译器语法会报错
//错误的初始化--初始化太多项
int arr[3]={1,2,3,4};
3. ⼀维数组的使用
每个数组元素都有对应的下标,与常识有点差别,数组的下标是从0开始
假设数组有n个元素,最后⼀个元素的下标是n-1,下标就相当于数组元素的编号
如果我们定义了一个数组,如下,10个元素,那么它的下标就是0~~9
int arr[10]={1,2,3,4,5,6,7,8,9,10};
举个栗子:
#include<stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
//一维数组的输入
for(i=0;i<10;i++)
{
//循环打印数组每个元素
scanf("%d",&arr[i]);//注意%d之后不要有空格
}
//一维数组的打印
for(i=0;i<10;i++)
{
//循环打印数组每个元素
printf("%d ",arr[i]);
}
return 0;
}
//结果为1 2 3 4 5 6 7 8 9
4. ⼀维数组在内存中的存储
当我们运行以下代码时,能够得到各数组元素的地址
#include<stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i=0;i<10;i++)
{
//%p为地址的占位符
printf("%p\n",&arr[i]);
}
return 0;
}
运行结果如下:
做个补充,
(1)这里显示的地址是十六进制的数,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f(逢十六进一);
(2)计算机在处理数据时,都要将数据加载到内存中处理,所以我们买电脑时内存是一个重要指标,而在内存中,会被划分为一小块一小块的内存单元,然后给每个内存单元编上号,这就是所谓的地址,在C语言中也叫指针。
(3)这里的地址在C语言中又称为指针,它就像房间的门牌号,找到门牌号就找到了房间,找到了指针(地址)就找到了在这个内存中存储的内容,在这了我们不细讲,指针会在之后会着重讲解。
可以看出,数组随着下标的增⻓,地址是由⼩到⼤变化的,并且我们发现每两个相邻的 元素之间相差4(因为⼀个整型是4个字节),因此数组的存储是连续。
5. sizeof计算数组元素个数
5.1 sizeof的介绍
sizeof是C语言的一种单目操作符,如C语言的其他操作符++,--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小,操作数可以是一个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定。
注意注意,单位是字节!!!!
int a;
sizeof(int);//4
sizeof(a);//4
int arr[10];
sizeof(arr)//40(4*10)
sizeof(arr[0])//10(数组中的一个整型元素)
5.2 sizeof计算数组元素个数
#include <stido.h>
int main()
{
int arr[10] = {0};
//整个数组的长度(字节数)除以一个元素的长度(字节数)
//就打印数组元素个数
int sz = sizeof(arr)/sizeof(arr[0]);
printf("%d\n", sz);
return 0;
}
eg.如果是字符串数组,也可以用strlen计算(这里的strlen是一个库函数,而sizeof是一个操作符,需要大家了解一下)
#include<stdio.h>
#include<string.h>//用strlen需要引用这个头文件
int main()
{
char arr = "hello world";//字符串数组要用双引号
int sz = strlen(arr);//结果为11
return 0;
}
6. ⼆维数组的创建
6.1 二维数组的概念
6.2 ⼆维数组的创建
二维数组的定义如下:
type arr_name[常量值1][常量值2];
//例如:
int arr[3][5];
double data[2][8];
7. ⼆维数组的初始化
7.1 完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
7.2 不完全初始化
int arr1[3][5] = {1,2};
int arr2[3][5] = {0};
未初始化的默认初始化为0
7.3 按照行初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};
未初始化的默认初始化为0
7.4 初始化时省略行,但是不能省略列
int arr5[][5] = {1,2,3};
int arr6[][5] = {1,2,3,4,5,6,7};
int arr7[][5] = {{1,2}, {3,4}, {5,6}};
8. ⼆维数组的使用
8.1 ⼆维数组的下标
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
#include <stdio.h>
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
printf("%d\n", arr[2][4]);
return 0;
}
结果为7.
8.2 二维数组的输入与打印
#include <stdio.h>
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
int i = 0;//遍历⾏
//输⼊
for(i=0; i<3; i++) //产⽣⾏号
{
int j = 0;
for(j=0; j<5; j++) //产⽣列号
{
scanf("%d", &arr[i][j]); //输⼊数据
}
}
//输出
for(i=0; i<3; i++) //产⽣⾏号
{
int j = 0;
for(j=0; j<5; j++) //产⽣列号
{
printf("%d ", arr[i][j]); //输出数据
}
printf("\n");
}
return 0;
}
9. ⼆维数组在内存中的存储
#include <stdio.h>
int main()
{
int arr[3][5] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
结果如下:
10. C99中的变长数组
如有错误,请各位彦祖亦菲们批评指正(评论或私信都可以)。