数组
1. 一维数组的创建和初始化
2. 一维数组的使用
3. 一维数组在内存中的存储
1. 一维数组的创建和初始化。
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 数组的初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。
#include <stdio.h>
#include <string.h>
int main()
{
int n = 10; //初始化
//int arr[10] = {1,2,3,4,5,6,7,8,9,10}; //完全初始化
int arr[10] = {1,2,3,4,5}; //不完全初始化
int arr2[] = { 1,2,3,4,5 }; //int arr2[5] = {1,2,3,4,5};
char ch1[5] = { 'w','y','h' };
char ch2[] = {'w','y','h'};
char ch3[5] = "wyh";
char ch4[] = "wyh";
char ch5[] = "wyh";
// //[w y h \0]
char ch6[3] = { 'w','y','h' };
// // [w y h]
printf("%s\n", ch5);
printf("%s\n", ch6);
printf("%d\n", strlen(ch5)); //3
printf("%d\n", strlen(ch6)); //随机值
return 0;
}
char ch5[] = "wyh";
// //[w y h \0]
char ch6[3] = { 'w','y','h' };
// // [w y h]
只有字符数组后才有\0
数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确 定。 但是对于上面的代码要区分,内存中如何分配。
1.3 一维数组的使用
对于数组的使用我们之前介绍了一个操作符: [ ] ,下标引用操作符。它其实就数组访问的操作符。
#include <stdio.h>
int main()
{
int arr[10] = { 0 };// //数组的不完全初始化
arr[4] = 5; // //[] - 下标引用操作符
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr[0]));
printf("--------------------------------------\n");
int sz = sizeof(arr) / sizeof(arr[0]); // //计算数组的元素个数
int i = 0; // 对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
//做下标
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);//输出数组的内容
}
//printf("%d\n", arr[4]);
return 0;
}
总结:
- 数组是使用下标来访问的,下标是从0开始。
- 数组名表示首元素的地址
- 数组的大小可以通过计算得到。
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);
1.4 一维数组在内存中的存储
数组在内存中的存储
整形为4个字节
#include <stdio.h>
// //%p - 是按地址的格式打印 - 十六进制的打印
int main()
{
// //printf("%x\n",0x12);
// //printf("%p\n",0x12);
int arr[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++)
{
printf("&arr[%d] = %p\n", i, &arr[i]);
}
return 0;
}
随着数组下标的增长,元素的地址,也在有规律的递增。
由此可以得出结论:数组在内存中是连续存放的。
#include <stdio.h>
// //%p - 是按地址的格式打印 - 十六进制的打印
int main()
{
// //printf("%x\n",0x12);
// //printf("%p\n",0x12);
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int*p = arr; // //数组名是指向数组首元素的地址
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", *p);
p++;
}
return 0;
}
- 数组名是数组首元素的地址
- 随着数组下标的由小到大,地址由低到高
- 数组在内存中是连续存放的。