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