数组

1、数组的定义

数组是包含给定类型的一组数据,即一组相同类型元素的集合
定义数组的三要素

  1. 类型
  2. 数组名
  3. 方括号[](告诉编译器它是一个数组)
    注意:数组大小必须是一个常量(只能读不能写)
#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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值