目录
声明数组:
在C中要声明一个数组,需要指定元素的类型和元素的数量,如下:
double balance[10]; //声明了一个类型为double的包含10个元素的数组balance
初始化数组:
double balance[3] = {1000.0,2.0,3.4};
也可以这样
double balance[ ] = {1000.0,2.0,3.4};
下面是为数组中某个元素赋值:
balance[4] = 50.0; //表示把数组中**第五个**元素的值赋为50.0
所有的数组都是以0作为第一个元素的索引,数组的最后一个索引是数组的总大小减1。
访问数组元素:
数组元素可通过数组名称加索引进行访问,如下:
double salary = balance[9]; //将数组中第10个元素的值赋给salary变量。
几个数组的例子:
1.计算平均数并挑出比平均数大的数字
#include<stdio.h>
int main()
{
int x;
double sum=0;
int cnt=0;
int number[100]; //定义数组,即定义了一个叫做number的数组变量。
scanf("%d", &x);
while(x!=-1)
{
number[cnt]=x; //对数组中的元素进行赋值。为了搞清楚这段代码是怎么做事情的,在下边加入调试代码。
//调试代码开始
{
int i;
printf("%d\t",cnt);
for(i=0;i<=cnt;i++)
{
printf("%d\t",number[i]);
}
printf("\n");
}
//调试代码结束
sum+=x;
cnt++;
scanf("%d", &x);
}
if(cnt>0)
{
printf("%f\n", sum/cnt);
//下面的代码是为了在算出一个平均数后,再用一个循环**遍历数组**,挑出number中比平均数大的number。
int i;
for(i=0; i<cnt; i++)
{
if(number[i]>sum/cnt)
{
printf("%d\n",number[i]);
}
}
}
return 0;
}
输入1 2 3 4 5后,得到如下。再输入-1,得到平均数和比平均数大的数字。
sunyuhang@666:~/c$ ./1
1 2 3 4 5
0 1
1 1 2
2 1 2 3
3 1 2 3 4
4 1 2 3 4 5 //这些是调试代码生成的。
-1
3.000000
4
5
2.统计输入数字出现的次数,输入-1结束
#include<stdio.h>
int main(void)
{
const int number =10; //数组的大小
int x;
int count[number]; //定义数组
int i;
for(i=0;i<number;i++) //初始化数组
{
count[i]=0;
}
scanf("%d", &x);
while(x!=-1)
{
if(x>=0 && x<=9)
{
count[x] ++; //数组参与运算
}
scanf("%d", &x);
}
for(i=0;i<number;i++) //遍历数组输出
{
printf("%d:%d\n",i,count[i]);
}
return 0;
}
输出为:
sunyuhang@666:~/c$ gcc 2.c -o 2
sunyuhang@666:~/c$ ./2
1 1 2 2 3 4 5 5 5 6 6 6 6 6
-1
0:0
1:2
2:2
3:1
4:1
5:3
6:5
7:0
8:0
9:0
3.找出数字在数组中的位置
#include<stdio.h>
//找出key在数组a中的位置,length表示数组的长度。如果找到,返回位置,没找到返回-1。
int search(int key,int a[],int length); //函数声明
int main()
{
int a[]={2,3,4,5,6,7,8,9,0,12,13,34,45};
int x;
int loc;
printf("请输入一个数字:");
scanf("%d", &x);
loc=search(x,a,sizeof(a)/sizeof(a[0])); //sizeof(a)给出整个数组所占据内容的大小,
if (loc!=-1) //sizeof(a[0])给出数组中单个元素的大小,
{ //相除就得到数组中元素的个数,即得到数组的长度。
printf("%d在第%d个位置上\n",x,loc);
}
else
{
printf("%d不存在\n",x);
}
return 0;
}
int search(int key,int a[],int length) //数组作为函数参数时,往往必须再用另一个参数来传入数组的大小。
{
int ret=-1;
int i;
//遍历数组去判断我们要找的那个东西是否存在。如果存在,则返回key值并break出来。
//如果遍历完数组仍然没有找到我们想要的key,则ret返回初始值-1。
for(i=0;i<length;i++)
{
if(a[i]==key)
{
ret=i;
break;
}
}
return ret;
}
输出为:
sunyuhang@666:~/c$ ./3
请输入一个数字:4
4在第2个位置上
二维数组:
声明一个 x 行 y 列的二维数组,形式如下:
type arrayName [ x ][ y ];
初始化二维数组:
int a[3][4] = {
{0, 1, 2, 3} , // 初始化索引号为 0 的行
{4, 5, 6, 7} , // 初始化索引号为 1 的行
{8, 9, 10, 11} // 初始化索引号为 2 的行
};
列数是必须给出的,行数可以由编译器来数;每行一个{},逗号分隔。
下面的初始化与上面是等同的:
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
访问二维数组的元素:
二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。
eg:
int val = a[2][3];
上面的语句将获取数组中第3行第4个元素。
实例:(使用嵌套循环处理二维数组)
#include <stdio.h>
int main ()
{
int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}}; //定义一个5行2列的数组
int i, j;
for ( i = 0; i < 5; i++ ) //二维数组的遍历
{
for ( j = 0; j < 2; j++ )
{
printf("a[%d][%d] = %d\n", i,j, a[i][j] );
}
}
return 0;
}
编译运行得到,
a[0][0] = 0
a[0][1] = 0
a[1][0] = 1
a[1][1] = 2
a[2][0] = 2
a[2][1] = 4
a[3][0] = 3
a[3][1] = 6
a[4][0] = 4
a[4][1] = 8
例题
(1)a[ 1>2 ] [ !1]
表示的是bool值和整型间的转换。
C语言中0为false,1为true。
第一个,1>2为false,表示0;第二个1取反,表示0;
也就是访问a[0][0]。
(2)int a[ ][3] = {{0}, {1}, {2}};则,a[1][2] = ?
答:等于0。
(3)p[-2]是多少?
对于
int a[ ] = {5, 15, 34, 54, 14, 2, 52, 72};
int *p = &a[5];
则,p[-2]的值是多少?
答:54。