1、数组的定义
数组是包含给定类型的一组数据,即一组相同类型元素的集合
定义数组的三要素
- 类型
- 数组名
- 方括号[](告诉编译器它是一个数组)
注意:数组大小必须是一个常量(只能读不能写)
#include<stdio.h>
#include<time.h>
#include <stdlib.h>
int main()
{
int n = 5;
int arr[n] = { 5, 4, 3, 2, 1 };
int brr[5] = { 5, 4, 3, 2, 1 };
}
//编译
严重性 代码 说明 行
错误(活动) E0028 表达式必须含有常量值 7
2、数组的初始化
数组进行初始化,不管是声明类型的数据,对于未初始化的元素,系统都默认初始化未0,对应的ASCII值也为0
#include<stdio.h>
#include<time.h>
#include <stdlib.h>
int main()
{
int arr[5] = { 5, 4, 3 };
char brr[5] = { 'a', 'b', 'c' };
double crr[5] = { 2.0, 4.0, 6.0 };
printf("数组arr未初始化值:%d,%d\n", arr[3], arr[4]);
printf("数组brr未初始化值:%d,%d\n", brr[3], brr[4]);
printf("数组brr未初始化值:%d,%d\n", crr[3], crr[4]);
}
//打印结果
数组arr未初始化值:0,0
数组brr未初始化值:0,0
数组brr未初始化值:0,0
3、三个常用的常量
1、宏常量
2、字面常量
3、常变量
#include<stdio.h>
#include<time.h>
#include <stdlib.h>
#define SIZE 10
const int length = 10;
int main()
{
int arr[length] = { 5, 4, 3 };
char brr[SIZE] = { 'a', 'b', 'c' };
double crr[5] = { 2.0, 4.0, 6.0 };
}
4、数组名
数组名被看作该数组的第一个元素在内存中的首地址,(仅在sizeof操作中例外,该操作给出数组所占内存大小)。数组名在表达式中被自动转换为一个指向数组第一元素的指针常量 。
数组名是指针,非常方便,但是却丢失了数组另一个要素,数组的大小,即数组元素的数量。编译器按数组定义时的大小分配内存,但运行时对数组边界不加检测。这会带来无法预知的严重错误
4.1、数组名等价于数组的第一个元素的首地址。
int main()
{
int arr[5] = { 5, 4, 3 };
printf("数组名arr的地址: 0x%8x\n", arr);
printf("数组首元素的的地址:0x%8x", &arr[0]);
}
//打印输出结果
数组名arr的地址: 0x 10ffb94
数组首元素的的地址:0x 10ffb94
4.2、数组名作为第一个元素的首地址,具有常性
int main()
{
int arr[5] = { 5, 4, 3 };
arr = NULL;
}
严重性 代码 说明 行
错误(活动) E0137 表达式必须是可修改的左值 7
4.3、当数组名和sizeof结合的时候,计算的是数组的大小
int main()
{
int arr[10] = { 1, 2 };
char brr[10] = { 1, 2 };
double crr[10] = { 1, 2 };
int a = sizeof(arr);
int b = sizeof(brr);
int c = sizeof(crr);
printf("数组arr的大小:%d\n", a);
printf("数组brr的大小:%d\n", b);
printf("数组crr的大小:%d\n", c);
}
//打印输出结果
数组arr的大小:40
数组brr的大小:10
数组crr的大小:80
5、数组的访问
数组的访问有两种方式
1、下标法
2、指针法
两种访问的等价形式,从物理上来说,是把下标访问转化成了指针访问
arr[i] == *(arr + i)
int main()
{
int arr[5] = { 1, 2, 3, 4, 5 };
int* p = arr;
for (int i = 0; i < 5; i++)
{
printf("0x%08x %d %d\n", p+i, p[i], *(p + i));
}
printf("---------------\n");
for (int i = 0; i < 5; i++)
{
printf("0x%08x %d %d\n", arr + i, arr[i], *(arr + i));
}
}
//打印输出结果
0x010ff944 1 1
0x010ff948 2 2
0x010ff94c 3 3
0x010ff950 4 4
0x010ff954 5 5
---------------
0x010ff944 1 1
0x010ff948 2 2
0x010ff94c 3 3
0x010ff950 4 4
0x010ff954 5 5
6、数组、指针、函数的关系
用数组作为函数的形参,数组将退化为指针类型,如果不退化为指针,当传入的数组很大,调用一个函数就把栈区给占满了,时间效率和空间效率都很低
在函数中,把传入的数组退化为指针的根本原因,节省时间和空间
void Print_Array(int br[100], int n)
{
int len = sizeof(br);
printf("len:%d\n", len);
}
int main()
{
int arr[5] = { 1, 2, 3, 4, 5 };
Print_Array( arr, 5);
}
//打印结果
len:4