目录
1. 一维数组的创建和初始化
1.1 数组的创建
数组是一组相同类型元素的集合。
数组的创建方式:(语法形式)
type_t arr_name [const_n];
type_t 是指数组的元素类型;
const_n 是一个常量表达式,用来指定数组的大小。
注意:
数组创建,在C99标准之前, [ ] 中只能是常量,不能使用变量。
在C99标准中支持了变长数组的概念,允许数组的大小是变量,而且要求编译器支持C99标准。
VS2019对C99的支持不好,所以在VS2019中不能使用变长数组概念。
变长数组不能初始化,这是语法要求。
因为用变量来指定大小时,变量是代码运行起来的时候才创建的,在编译器不知道变量(数组大小)具体是多少的时候对数组初始化是没有意义的。
1.2 数组的初始化
数组的初始化是指在创建数组的同时给数组的内容一些合理初始值(初始化)。
#include <stdio.h>
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };//完全初始化
int arr1[10] = { 1,2,3 };//不完全初始化,剩余元素默认初始化为0
int arr2[10] = { 0 };//数组的不完全初始化,第一个元素指定为0,剩余元素默认初始化为0,即全都是0
int arr3[] = { 1,2,3 };//数组有3个元素,即数组大小是3
//对数组进行初始化可以不指定数组大小
//此时数组大小是根据初始化内容确定的
int arr4[] = { 0 };//数组有1个元素,数组大小是1
/*int arr[] = { 0 };
int i = 0;
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}*/
//错误示范:越界访问
return 0;
}
数组在创建的时候如果想不指定数组的确定的大小就需要初始化;
数组的元素个数根据初始化的内容来确定。
但是对于下面的代码要区分,内存中如何分配:
char arr1[] = "abc";
char arr2[3] = {'a','b','c'};
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[3] = { 'a',98,'c' };//98是字符a的ASCII值,相当于放的也是字符b
char arr2[] = { 'a','b','c' };//数组有3个元素,数组大小是3(3个字节),因为每个元素是一个字符,一个字符是一个字节
printf("%d\n", sizeof(arr2));//3,打印的是数组空间的大小用的是sizeof()函数
//打印字符串长度,用strlen()函数
printf("%d\n", strlen(arr2));//不遇到'\0'不停,所以长度是随机值
char arr3[] = "abc";
printf("%d\n", sizeof(arr3));//4
//字符串是可以初始化字符数组的
//数组有4个元素,数组大小是4(4个字节)
printf("%d\n", strlen(arr3));//3,字符串长度是3
return 0;
}
strlen()函数是一个库函数;
计算的是字符串的长度,并且只能针对字符串,例如不能求整型数组的长度。
关注的是字符串中是否有'\0',计算的是'\0'之前的字符个数。
sizeof是一个操作符(运算符),像加、减、乘、除一样;
sizeof是用来计算变量所占内存空间大小的,任何类型都可以使用,不仅仅限于字符串。
只关注空间大小,不在乎内存中是否存在'\0'。
数组可以不初始化,但里面放的是随机值,随机值的内容是不可控的,像变量、数组这样的在创建的时候要对其初始化,做到对内容可控,这是好的代码书写习惯。
#include <stdio.h>
int main()
{
int arr[10];//内容是随机值,不报错但有警告:“arr”: 未引用的局部变量
//int a;//a里放的也是随机值
//printf("%d\n", a);//报错:使用了未初始化的局部变量“a”
return 0;
}
1.3 一维数组的使用(访问)
操作符: [ ] ,下标引用操作符。它其实就是用来访问数组元素的操作符。
下标是用来访问元素的。
当访问数组某一个元素时,某一个元素的下标可以是变量,例如arr[i]。
指定(创建)数组空间大小时候必须是常量。
数组的访问——>使用[ ]即可。
1、打印数组元素(输出)
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", arr[5]);//6
//[]是下标访问操作符
//若打印整个数组:
int i = 0;
//计算数组元素个数:
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);//arr[i]就是数组某一个元素
//1 2 3 4 5 6 7 8 9 10
}
return 0;
}
2、若输入元素再访问:(输入)
//若放入一些值(元素)到数组中再打印
#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++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
即可以输入也可以输出。对数组元素可以往进放也可以向外取。输入是可以重置数组的,若想把它改掉可以重新输入一下。
总结:
- 1. 数组是使用下标来访问的,下标是从0开始。
- 2. 数组的大小可以通过计算得到。
1.4 一维数组在内存中的存储
一个整型元素(int)的大小是4个字节。
在内存中