1、一维数组的创建和初始化
数组可以说是目前为止讲到的第一个真正意义上存储数据的结构。虽然前面学习的变量也能存储数据,但变量所能存储的数据很有限。不仅如此,数组和指针(后续会讲)是相辅相成的,学习数组可以为学习指针打下基础。
那么到底什么是数组呢?顾名思义数组就是很多数的集合!那么这些数有没有什么要求呢,是不是不管什么数组合在一起都是数组呢?同一数组中存储的数必须满足以下两个条件:
1. 这些数的类型必须相同。
2. 这些数在内存中必须是连续存储的。
换句话说,数组是在内存中连续存储的具有相同类型的一组数据的集合。
一维数组的创建
类型说明符 数组名[ 常量 表达式];
一维数组初始化
(1)完全初始化:int a[5] = {1, 2, 3, 4, 5};
(2)不完全初始化:int a[5] = {1, 2};
char arr1[5]={'H','e'};
char arr2[10]="hello"; // 此时数组中第6个元素的值为'\0'
char arr2[8]={'a',98};
(3)如果定义数组时就给数组中所有元素赋初值,那么就可以不指定数组的长度,因为此时元素的个数已经确定了。编程时我们经常都会使用这种写法,因为方便,既不会出问题,也不用自己计算有几个元素,系统会自动分配空间。例如:
// int a[5] = {1, 2, 3, 4, 5};
int a[] = {1, 2, 3, 4, 5};
sizeof和strlen的区别:
sizeof的功能是计算一个数据类型的大小,这个类型可以是数组、函数、指针、对象等,单位为字节,它的返回值是size_t类型,也就是unsigned int类型,是一个无符号整数。注意:sizeof不是一个函数,它是一个运算符,所以它不需要包含任何头文件。
strlen的功能是计算一个指定字符串的长度,函数原型是size_t strlen(const char *s),它的返回值是size_t类型,也就是unsigned int类型,返回的是字符串的长度,需要包含头文件#inlude <string.h>,参数s是字符串首地址。
区别:
1、sizeof会将空字符\0计算在内,而strlen不会将空字符\0计算在内;
2、sizeof会计算到字符串最后一个空字符\0并结束,而strlen如果遇到第一个空字符\0的话就会停止并计算遇到的第一个空字符\0前面的长度。
#include <stdio.h>
int main() {
char arr[] = "hello";
int size = sizeof(arr);
int length = strlen(arr);
printf("size = %d, length = %d",size,length);
}
2、一维数组的使用
对于数组的使用我们之前介绍过一个操作符:[],下标引用操作符。通过它可以操作数组中的元素。
#include <stdio.h>
int main() {
int arr[10] = { 0 }; // 数组的不完全初始化
// 计算数组中元素的个数
int length = sizeof(arr) / sizeof(arr[0]);
// 对数组内容赋值,数组的元素是使用下标来访问的,下标从0开始
int i = 0; // 下标
for (; i < length;i++) {
arr[i] = i;
}
// 输出数组的内容
for (i = 0; i < length;i++) {
printf("%d\n",arr[i]);
}
}
总结:
1、数组元素是使用下标来访问的,下标从0开始
2、数组的大小可以通过计算获得,字符数组的长度还可以通过strlen计算获得。
int arr[10] = { 0 };
int length = sizeof(arr) / sizeof(arr[0]);
char arr2[]="Hello";
int length2 = strlen(arr2);
3、一维数组在内存中的存储
#include <stdio.h>
int main() {
int arr[10] = { 0 };
// 计算数组中元素的个数
int length = sizeof(arr) / sizeof(arr[0]);
int i = 0; // 下标
for (; i < length; i++) {
arr[i] = i;
}
// 输出数组中每个元素的地址
for (i = 0; i < length; i++) {
printf("%p\n", &arr[i]);
}
}
仔细观察输出的结果,随着数组下标的增长,元素的地址也在有规律的递增。由此可以得出结论:数组在数组中是连续存放的。
4、二维数组的创建与初始化
(1)二维数组的创建
int arr[3][4];
char arr[3][5];
double arr[2][4];
(2)二维数组的初始化
int arr[3][4]={1,2,3,4};
int arr[3][5]={{1,2},{4,5}};
int arr[][4]={{2,3},{1,2}};
5、二维数组的使用
include <stdio.h>
int main() {
// 打印二维数组
int arr[3][5] = { {2,4,6},{1,3,5} };
// 获取行数
int rows = sizeof(arr) / sizeof(arr[0]);
// 获取每一行中元素的个数
int cells = sizeof(arr[0]) / sizeof(arr[0][0]);
for (int i = 0; i < rows;i++) { // 遍历行
for (int j = 0; j < cells;j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
6、二维数组在内存中的存储
#include <stdio.h>
通过结果分析,其实二维数组在内存中也是连续存储的。
int main() {
// 打印二维数组
int arr[3][5] = { {2,4,6},{1,3,5} };
// 获取行数
int rows = sizeof(arr) / sizeof(arr[0]);
// 获取每一行中元素的个数
int cells = sizeof(arr[0]) / sizeof(arr[0][0]);
for (int i = 0; i < rows;i++) { // 遍历行
int* temp = arr[i];
printf("%p\n",temp);
for (int j = 0; j < cells;j++) {
printf("%p ", &temp[j]);
}
printf("\n");
}
}
通过结果分析,其实二维数组在内存中也是连续存储的。