数组
数组的创建
type_t arr_name [coust_n]
//tyep_t是数组的元素类型 int char
//coust_n是一个常量表达式,用来指定数组大小(不可以是负数)
注:C99 语法支持 变长数组——数组的大小是变量(VS2019不支持变长数组)
变长数组是不支st持初始化的,并且变长数组也是不能用static,extern等关键字修饰的。
第一种初始化(传统法):
在创建时给上值。
char arr[3]={'0','1','2'};
元素个数等于创建大小是完全初始化,另一种叫不完全初始化。{ }中值的数目不能大于在数组声明时在[ ]中指定的元素数目。不完全初始化的未出现元素都被默认初始化为0。
int arr[2]={ 0 };//全部为0
在初始化数组时,可以不指定数组的大小。但是操作系统会根据初始化的内容来自动开辟空间。
字符串后默认有一个“\0”。
char ch5[]={'bit'};
开辟的空间储存为 b i t \0
打印结果为 bit
char ch6[]={'b','i','t'}
开辟的空间储存为 b i t
打印结果为 bit烫烫....(乱码)it
打印时“\0”为结束标志
同时求字符串长度时(strlen)
第一个为3;第二个为随机值。
第二种初始化(C99支持的):
int arr[3] = {[2] = 3};
直接将下标为2的第三个元素初始化为3。
注:在VS上,C99支持的不是很好,会报错。
int arr[10]={23,43,24,[3]=54,34,54,[7]=43,[1]=24};
这样初始化的特点:
1.如果初始化数组容量较大,这样初始化可指定某一元素为特定的值。同时如果这种初始化后,以上面的代码为例,[3]=54,34,54,那么第四个元素为54,后面接着的元素为34,54就会默认给第五个元素,第六个元素作为[4],[5]的初始化的值。
2.如果再次初始化指定元素,那么最后初始化的值会取代之前初始化的值,如上面代码中,[1]=24,那么第二个元素的输出结果为24,而不是第一次初始化的43。
如果像下面这样初始化,
int arr[]={43,[7]=64};
那么用scanf输出的结果为 43 0 0 0 0 0 0 64。
这是因为如果未在[ ]内指定元素的个数,那么编译器会自动将数组大小设置为能足够装下初始化的值。
讨论strlen和sizeof
1.sizeof为一个操作符(运算符);而strlen是库函数,使用时要引头文件string.h。
2.用途不同:sizeof是计算一个数组(或其他类型)所占空间大小,strlen是专门用于求字符串的长度,将'\0'前面的字符串的长度计算出来。
3.计算方法机制不同。sizeof 不会受到'\0'等字符的影响,,关注的是空间的大小,有多少空间就计算多少空间。strlen是遇到'\0'时才会停止,关注的是字符串的长度。并且是在遇到第一个'\0'时就停止。如果没有遇到,将会是一个随机值(会一直往后找'\0',直到找到。
一维数组的使用
1.数组是使用下标来访问的,下标从0开始。
也称为:所有数组都是以0作为它们第一个元素的索引,即基索引,数组的最后一个索引是数组的总大小减去一。
printf("%d ",arr[3]);
如果想把数组中全部元素都打印出来,
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int siz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < siz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
sizeof(数组名)计算数组大小,单位 字节
假设整型数组元素为10,得数为40(整型一维数组的元素内存大小是4)
sizeof(数组[0])第一个元素的大小
sizeof(arr)/sizeof(arr[0])
//为元素个数
方法:数组的大小除以数组每个元素的大小
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int siz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < siz; i++)
{
scanf("%d",&arr[i]);
}
for (int i = 0; i < siz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
同理,数组的每个元素也是支持算法、赋值等运算的。
这时我们可以用到关键词:const
注: const是什么呢?
const int arr[3]={1,2,3};
这样,数组中的每个元素就变成了只能访问的,而不能修改的变量了。数组中的每个元素就变成了const int类型。
并且,在一个函数中,如果不想要形参被修改,可用 const修饰,这样,会对变量经行保护。
2.数组的大小可以通过计算得到。
一维数组在内存中是连续存放的!
3.可以用[ ]来对数组进行访问(下标/索引)
int k=arr[2];
利用概念(声明数组,数组赋值,访问数组),可得
int main()
{
int arr[10] ;//声明
int i, j;
for (i = 0; i < 10; i++)
{
arr[i] = i + 100;//赋值
}
for (j = 0; j < 10; j++)
{
printf("arr[%d]=%d\n", j,arr[j]);//访问
}
return 0;
}