一,概念
1,存储一个数据类型的组合。
2,定义格式:类型 数组名[元素个数]
数组的个数是从0开始计算。
Test[0] = 10;
Test[1] = 18;
Test[2] = 45
Test[3] = 54
下面用一个程序来遍历数组
#include <stdio.h>
int main()
{
int ages[5] = {10, 8, 23,45, 89};
for(int i = 0; i <5; i++)
{
printf("ages[%d]= %d\n",i , ages[i]); //打印某个位置对应的值i,打印5以内的循环并输对应的什ages[i]
}
return 0;
}
二,初始化注意点
int test[5] = {[3] = 10, [4] = 56}; // 如果数组的元素太多,我们只想用中间的两个可这样写
int test[] = {12, 34,22,21}; // 只要确定数组元素个数,[]里的数可以不用写
int ages[]; // 错误。因数没有元素个数,也没有值。
int ages[]; // 正确. 只能在定义数组的同时初始化
int ages2['A'] ={19, 43, 54,21}; //正确。 因为'A'的ASCII码值是65
//int size = sizeof(ages2) // 这里可以计算一下它占用的字节数
int ages = 5;
int count[ages] = {12, 33, 28} // 这种是错误写法
int count[ages];
int count[0] = 10;
int count[1] = 13; // 可以定义和初始化
三,利用sizeof计算一下数组长度
#include <stdio.h>
int main()
{
int ages[] = {10, 22,32, 24,33};
int size = sizeof(ages)/sizeof(int); // 总的字节数除单个的字节数等于元素个数
for(int i = 0; i < size; i++) //遍历每个元素对应的值
{
printf("ages[%d] = %d\n",i , ages[i]);
}
return 0;
}
四,内存细节分析
如:char cs[5] = {‘a’, ‘c’,‘d’, ‘f’};
1,这里的第个字节都有自己的地址,地址在内存是由大到小分配的。
2,数组刚好反过来,它是按顺序[0], [1], [2], [3]排下去
3,整个数组也有自己的地址就是数组首元素的地址。所以在用数组作为函数参数里,传递的是地址值,而不是数值。
#include <stdio.h>
int main()
{
char cs[5] = {'a', 'c', 'd','e'};
// printf("%p\n",cs); // 把地址值输出看看
//利用for循环遍历第个元素的地址值
for(int i = 1; i < 5; i++)
{
printf("cs[%d] = %p",i ,&cs[i]);
}
return 0;
}
<pre name="code" class="objc">#include <stdio.h>
int main()
{
int ages[3] = {10, 7, 12};
for(int i = 0; i <3 ; i++) // 遍因int型数据的地址值差
{
printf("ages[%d]地址是:%p\n",i ,&ages[i]);
}
return 0;
}
五,数组与函数:如果数组作为函数参数,是在同一块内存中值的传递。
#include <stdio.h>
//void chage(int array[])
//{
// array[0] = 100;
//} //这里是地址值的转换。第一个元素100可替换
void change(int n)
{
n = 100;
}
int main()
{
int ages[6] = {12, 43, 23, 333, 22,21};
// change(ages[0]); //这里只不对外的n有影响
printf("%d\n",ages[0]);
return 0;
}