C语言—初始化数组

作者:追风剑情 发布于:2019-9-28 0:48 分类:C

示例

//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

#define SIZE 4
#define MONTHS 12

//argc: 参数个数 argv[]: 参数数组
int main(int argc, char *argv[])
{
	
	int arr0[SIZE];
	//从ANSI C开始支持这种括号初始化方式
	int arr1[SIZE] = {1, 2};//未被初始化部分会被编译器自动设置为0
	int arr2[] = {1,2,3};//让编译器自动设置数组长度

	//未初始化的数组将打印出当前内存地址存放的值(垃圾值)
	for (int i = 0; i < SIZE; i++)
		printf("arr0[%d]=%d\n", i, arr0[i]);

	for (int i = 0; i < SIZE; i++)
		printf("arr1[%d]=%d\n", i, arr1[i]);

	for (int i = 0; i < SIZE; i++)
		printf("arr2[%d]=%d\n", i, arr2[i]);

	const int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
	unsigned days_size = sizeof(days);//返回整个数组所占字节数
	printf("days_size=%u byte, %u unit\n", days_size, days_size/sizeof(days[0]));

	//利用sizeof计算数组长度
	unsigned count = sizeof days / sizeof days[0];
	for (int i = 0; i < count; i++) {

	}

	//-- 指定初始化器 --
	//可以利用方括号来指定初始化哪一个元素(C99新增加的特性)
	//下面这句代码,首先将1号位置初始化为28,后面又将1号位置初始为29
	//[4]=31,30,31这一段相当于[4]=31,[5]=30,[6]=31
	int days1[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};
	//如果不指定数组长度,编译器将自动设置成能容下初始化的值的长度aks =
	int days2[] = { 31, 28,[4] = 31, 30, 31,[1] = 29 };

	int oxen[SIZE] = { 5,3,2,8 };
	int yaks[SIZE];
	//yaks = oxen; //错误的赋值方式
	//yaks[SIZE] = oxen[SIZE]; //数组越界
	//yaks[SIZE] = { 5,3,2,8 };//错误的赋值方式

	//注意:数组越界赋值,可能导致改变其他变量的值,也可能
	//导致程序异常中止(由编译器决定处理方式)

	int n = 5;
	const int m = 5;
	//C99标准允许这样声明,称为变长数组VLA
	//C11放弃了这一创新的举措,把VLA设定为可选,而不是语言必备的特性
	//float arrn[n];
	//const未被视为常量
	//float arrm[m];
	//sizeof表达式被视为常量
	float constarr[sizeof(int)];

	system("pause");
	return 0;
}

运行测试

1111.png

标签: C语言

Powered by emlog  蜀ICP备18021003号   sitemap

川公网安备 51019002001593号