数组:一组相同类型元素的集合
一维数组创建方式:元素类型 数组名 [常量表达式]
例如: int arr[8]; char ch[5];
易错点:
int n = 8; int arr[n];
该写法是错误的,因为括号里必须是[常量表达式],而n是变量。
一维数组的完全初始化: int arr[10] = { 1,2,3,4,5 ,6,7,8,9,10 };
一维数组的不完全初始化: int arr[10] = { 1,2,3,4,5 };
另外,int arr2[] = { 1,2,3,4,5 }; 相当于 int arr2[5] = { 1,2,3,4,5 };
知识点1:下标引用操作符和数组大小的计算
int main()
{
int arr[10] = { 0 };
arr[4] = 5; //[]就是下标引用操作符
int sz = sizeof(arr) / sizeof(arr[0]); //数组的大小
printf("数组的大小:%dn", sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
[]就是下标引用操作符,数组的大小用sizeof(arr) / sizeof(arr[0])来计算
运行结果:
总结:
1、数组通过下标来访问,下标是从0开始。
2、数组的大小可以通过计算得到。
知识点2:一维数组在内存中的地址
int main()
{
int arr[10] = { 0 };
for (int i = 0; i < 10; i++)
{
printf("&arr[%d] = %pn",i, &arr[i]);//可以发现每个数之间相差四个数(十六进制)
}
return 0;
}
%p - 是按地址的格式打印 - 十六进制的打印
运行结果:
总结:
1、一维数组在内存中是连续存放的
2、随着数组下标的增长,地址是由低向高变化的
补充:
%x - 十六进制
printf("%xn",0x12); //打印结果:12
printf("%pn",0x12); //打印结果:00000012
知识点3:数组名是数组首元素的地址
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr; //数组名是数组首元素的地址
for (int i = 0; i < 10; i++)
{
printf("%d ", *p);
p++;
}
return 0;
}
运行结果:
例题:从键盘读入n个整数放入数组中,删除数组中所有值为0的元素,其后元素向数组首端移动。输出删除后数组中元素的个数并依次输出数组元素。
例如,
输入:
6
2 0 4 0 0 3
输出:
3
2 4 3
代码实现:
int main()
{
int n = 0, i = 0, a = 0 , b = 0;
int arr[100];
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &a);
if (a)
arr[b++] = a;
}
printf("%dn", b);
for (i = 0; i < b; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果:



