“总有人间一两风,
填我十万八千梦”
🍑作者:小赛毛
💕文章初次日期:2022/10/1
目录
前言:为什么要引进数组?
比如下面我要存储一些数据:
int main()
{
/*int a = 1;
int b = 2;
int c = 3;*/
}
那么问题来了,如果我想存储1~100呢?这个问题相信看完本节,各位童靴心中就会有答案了!
1.一维数组的创建与初始化
1.1数组的创建
数组是一组相同元素的集合
什么意思呢?
就是这个数组里面放的都是相同类型
int main()
{
/*int a = 1;
int b = 2;
int c = 3;*/
//1~100
//数组-一组相同类型元素的集合
//
int arr[100] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[] = { 0 };
}
这里呢arr[100]表示存储100个元素 前面的int则表示存储的类型为int整形
数组的创建方式:
type_t arr_nmae [const_n];
//type_t 是指数组的元素类型
//const_n是一个常量表达式,用来指定
这个时候可能就有老铁要问了,那我在创建数组的的时候能不能用变量呢?什么意思呢?
int n = 10;
int arr[n];//c99中引入了变长数组的概念,允许数组的大小用变量来指定,如果编译器不支持c99中的变长数组,那就不能使用
//vs2019是不支持变长数组的
(变长数组):长度可变
1.2数组的初始化
int main()
{
int arr[10] = {1,2,3,4};//不完全初始化
return 0;
}
不完全初始化,只初始化一部分,其余部分默认初始化为0:
当然有些同学呢问道,这样写可以嘛?
int main() { int arr[10] = {1,2,3,4};//不完全初始化 char ch1[] = { 'a','b','c' }; char ch2[] = { 'a',98,'c' }; return 0; }
这样写也可以98对应的编码值就是b
当然数组的初始化可以不写,这里我们来看一下:
那有老铁有要问了,那我如果不初始化呢?
不初始化,生成的就是随机值
全局变量不初始化,值为0
局部变量不初始化,值为随机值
这是因为什么呢?
还有需要注意的一点是:
1.3一维数组的使用
对于数组的使用我们之前介绍了一个操作符:[] ,下标引用操作符。它其实就是数组访问的操作符。
接下来我们继续看:
int arr[100] = { 1,2,3,4,5,6 }; printf("%d\n", sizeof(arr));
这个地方为什么打印400呢? 100个元素,每个元素是整型
int arr[100] = { 1,2,3,4,5,6 }; //printf("%d\n", sizeof(arr));//400 //printf("%d\n", sizeof(arr[0]));//4 int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数的写法
所以:
int main() { int arr[100] = { 1,2,3,4,5,6 }; //printf("%d\n", sizeof(arr));//400 //printf("%d\n", sizeof(arr[0]));//4 int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数的写法 // 0 1 2 3 4 5 // 写代码来赋值1~100 int i = 0; for (i = 0; i < sz; i++) { arr[i] = i + 1; } for (i = 0; i < sz; i++) { printf("%d", arr[i]); }
1.4一维数组在内存中的存储
int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; //打印数组每个元素的地址 int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); for (i = 0; i < sz; i++) { printf("&arr[%d]=%p\n", i, &arr[i]); } return 0; }
所以我们可以得出结论:
1.一维数组在内存中是连续存放的!
2.随着数组下标的增长,地址是由低到高变化的~
那么呢~接下来利用指针再补充一点:
int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; //打印数组每个元素的地址 int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); int* p = &arr[0]; for (i = 0; i < sz; i++) { printf("&arr[%d]=%p<==>%p\n", i, &arr[i],p+i); } return 0; }
通过以上我们可以看出一个指针在这里跳跃4个字节,那我们知道了这一点后,有了这个基础对于数组的访问就可以换一种方法了,接下来往下看:
int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; //打印数组每个元素的地址 int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); int* p = &arr[0]; for (i = 0; i < sz; i++) { printf("%d ", *(p + i)); } //for (i = 0; i < sz; i++) //{ // printf("&arr[%d]=%p<==>%p\n", i, &arr[i],p+i); //} return 0; }
为什么会这样子呢?
最本质的原因其实就是因为数组在内存中的存储是连续的
%p - 打印地址(16进制)
%d - 打印整数(10进制)
加油啦,小比特~
记得一键三连嗷!三连!!三连!!!