C语言 -- 数组 -- 参考翁恺C语言程序设计

声明数组:

在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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值