示例
//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;
}
运行测试