Hello,我们又见面了,经过我们的不懈努力和学习,相信小伙伴的代码能力肯定提升不少,这一章我们讲数组。
- 一维数组的创建和初始化。
1.1数组的创建
数组是一组相同类型元素的集合。
数组创作的方式
type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n 是一个常量表达式,用来指定数组的大小
数组创建的实例
//代码1 int arr1[10]; //代码2 int count = 10; int arr2[count];//数组时候可以正常创建? //代码3 char arr3[10]; float arr4[1]; double arr5[20];
面对上面我们看到的代码,我们看到数组的创建中必须要用常量,就是我们的下标引用操作符[]
中得是个常量值
但是在有些编译器当中,还是支持是用变量的
:数组创建,在C99标准之前, [] 中要给一个常量才可以,不能使用变量。在C99标准支持了变长数
组的概念。
- 1.2数组的初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。
看代码:
int arr1[10] = {1,2,3}; int arr2[] = {1,2,3,4}; int arr3[5] = {1,2,3,4,5}; char arr4[3] = {'a',98, 'c'}; char arr5[] = {'a','b','c'}; char arr6[] = "abcdef";
我们一个一个来解释
int arr1[10] = {1,2,3}是存放了十个整型,其中前三个是放着1,2,3后面放着是0
int arr2[] = {1,2,3,4}存放四个整型
int arr3[5] = {1,2,3,4,5}存放五个整型
char arr4[3] = {‘a’,98, ‘c’}存放三个字符
char arr5[] = {‘a’,‘b’,‘c’}存放三个字符
char arr6[] = "abcdef"存放一个字符串,但是是七个字符,还有末尾的\0
数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。
但是对于下面的代码要区分,内存中如何分配。
char arr1[] = "abc"; char arr2[3] = {'a','b','c'};
arr1放着是’a’ ‘b’ ‘c’ ’ \0’
- 1.3一维数组的使用
对于数组的使用我们之前介绍了一个操作符: [] ,下标引用操作符。它其实就数组访问的操作符。
我们来看代码:
#include <stdio.h> int main() { int arr[10] = {0};//数组的不完全初始化 //计算数组的元素个数 int sz = sizeof(arr)/sizeof(arr[0]); //对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以: int i = 0;//做下标 for(i=0; i<10; i++) { arr[i] = i; } //输出数组的内容 for(i=0; i<10; ++i) { printf("%d ", arr[i]); } return 0; }
我们可以看到数组的下标是从0开始的
数组的大小可以通过sizeof操作符计算得到。
int arr[10]; int sz = sizeof(arr)/sizeof(arr[0]);
- 1.4 一维数组在内存中的存储
接下来我们探讨数组在内存中的存储。
看代码:
#include <stdio.h> int main() { int arr[10] = {0}; int i = 0; int sz = sizeof(arr)/sizeof(arr[0]); for(i=0; i<sz; i++) { printf("&arr[%d] = %p\n", i, &arr[i]);//%p打印的是指针变量的地址 } return 0; }
通过观察,发现地址是16进制,且每个前后地址相差4个字节,刚刚好是一个int ,也可以看出数组在存放过程中是连续存放的
2 二维数组的创建和初始化
- 2.1二维数组的创建
//数组创建 int arr[3][4]; char arr[3][5]; double arr[2][4];
第一个表示行,第二个表示列,拿第一个说明
int arr[3][4];
代表的就是三行四列的一个int类型
不要看他好像是三行四列的,其实他还是一个连续的数组,就比如第一行的第四列和第二行的第一列还是相差四个字节
- 2.2二维数组的初始化
//数组初始化 int arr[3][4] = {1,2,3,4}; int arr[3][4] = {{1,2},{4,5}}; int arr[][4] = {{2,3},{4,5}};//二维数组如果有初始化,行可以省略,列不能省略