数据元素的编号从0开始,比如a[0]代表a数组的第一个元素,方括号内含有数字几代表有几个元素。当数组初始化列表中的值小于数组元素个数时,编译器会把剩余值都初始化为0
//缺少的数组元素自动补0
#include<stdio.h>
#include<stdlib.h>
#define size 4
int main(int argc, char* argv[])
{
int i;
int a[size] = { 1,2,3 };
for (i = 0; i < size; i++)
{
printf("%2d %d\n",i+1,a[i]);//此时第四个输出的结果是4 0
}
return 0;
}
如果方括号内不写数字编译器可以自动计算数组元素的个数。
//让编译器自己来计算元素个数 #include<stdio.h> #include<stdlib.h> int main(int argc, char* argv[]) { int i; int a[] = { 1,2,3,4,5,6 }; for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)//sizeof a是整个数组的大小,除以单个元素大小为数组元素个数 { printf("%2d %d\n",i+1,a[i]); } return 0; }
输出结果为:
1 1
2 2
3 3
4 4
5 5
6 6
C99规定可以在初始化列表中使用带有方括号的下标来指明待初始化的元素 ,如下列例子,[1]=2说明第二个元素初始化为2,那么后面的值将被用于初始化指定元素后面的元素
#include<stdio.h>
#include<stdlib.h>
#define size 6
int main(int argc, char* argv[])
{
int i;
int a[size] = { 1,[1]=2,3,4,[5]=7};
for (i = 0; i < size; i++)//sizeof a是整个数组的大小,除以单个元素大小为数组元素个数
{
printf("%2d %d\n",i+1,a[i]);
}
return 0;
}
/*在支持C99的编译器中输出结果为:
0 1
1 2
2 3
3 4
4 0
5 7*/
数组的元素之和(用函数的调用),函数处理数组必须知道何时开始以及何时结束,还有一种方法为传递两个指针(一个指向开始,一个指向结尾)
//方法一:函数的调用
#include<stdio.h>
#include<stdlib.h>
#define size 10
int sum(int a[], int n)
{
int total = 0;
for (int i = 0; i < n; i++)
{
total += a[i];//a[i]也可以变为*(a+i)
}
printf("The size of a is %zd bytes.\n", sizeof(a));
return total;
}
int main(int argc, char* argv[])
{
int m[size] = {20,10,5,39,4,16,19,26,31,20};
int answer;
answer = sum(m,size);
printf("The total number of m is %ld.\n",answer);
printf("The size of m is %zd bytes.\n",sizeof(m));
return 0;
}
//方法二:双指针
#include<stdio.h>
#include<stdlib.h>
#define size 10
int sump(int *begin, int *end)
{
int total = 0;
while (begin < end)
{
total += *begin;//所有数组元素值的相加,此处注意应该为*begin,int与int*间接寻址级别不同
//循环体也可以变成total+=*begin++来让代码更简洁
begin++;//让指针指向下一个元素
}
printf("total=%d", total);
return total;
}
int main(int argc, char* argv[])
{
int m[size] = { 1,2,3,4,5,6,7,8,9,0 };
int answer;
answer = sump(m,m+size);
return 0;
}
后续有新的学习到的会继续补充,也请各位大佬不吝赐教,指出更好的算法,谢谢!