C语言(数组)

一、数组的概念

1、在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来,这些按序排列的 同类数据元素的集合称为数组。

2、在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是 基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针 数组、结构数组等各种类别。本章介绍数值数组和字符数组,其余的在以后各章陆续介绍。

3、总结:

        3.1  数组中的元素是连续的(元素的内存地址连续)。

        3.2  同一个数组的所有成员都是相同的数据类型。


二、一维数组

1、一维数组的定义

1.1、一维数组的定义语法规则

数据类型  数组名  [常量表达式];

说明:

(1)数组名的命名规范必须满足“标识符的命名规范”

(2)方括号中的常量表达式就是数组的长度,也就是数组中存储元素的个数 

例如:

int a[10];         说明整形数组a,有10个元素。

float b[10] , c[20];        说明实型数组b,有10个元素,实型数组c,有20个元素。

char ch[20];        说明字符数组ch,有20个元素。                     

1.2、一维数组的使用 

使用下标访问数组中的元素

(1)下标的值必须为整形常量/变量。

(2)下标的值从0开始 到数组长度-1结束。

  注意:如果使用的下标值大于或者等于数组长度,程序仍然可以编译通过,但是运行结果      是未知的。

1.3、数组的初始化 

给数组赋值的方法除了用赋值语句对数组元素逐个赋值外,还可采用初始化赋值和动态赋值的方法。

int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//定义一个数组,同时初始化所有成员变量

int a[10] = { 1, 2, 3 };//初始化前三个成员,后面所有元素都设置为0

int a[10] = { 0 };//所有的成员都设置为0

[]中不定义元素个数,定义时必须初始化

int a[] = { 1, 2, 3, 4, 5 };//定义了一个数组,有5个成员

注意:局部数组如果不初始化,内容为随机值。

/*
	一维数组的使用以及数组是如何遍历的
*/
#include <stdio.h>

int main()
{
	int a[10];  //定义了一个int类型的数组,数组名叫a,其中有10个成员。
	int i = 0;
	
	for(i=0;i<10;i++)
	{
		a[i] = i; //给数组赋值。
	}
	printf("数组初始化完毕\n");
	
	//遍历数组,并输出每个成员的值
	for(i=0;i<10;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("done!\n");
	
	return 0;
}
 1.4、一维数组元素在内存中的存储
/*
	数组的各种初始化方式及大小计算
*/

#include <stdio.h>

int main()
{
	int a[10] = {1,2,3}; //10表示数组的大小
	int data;
	int array[] = {100,200,300,400,500};
	int size;
	int b[10] = {0};
	
	/*
		1.把整个数组的大小,除以数组中一个元素的大小,就可以获得总个数.
		2.sizeof关键字,能计算括号中对应数据的内存空间大小
	*/
	size = sizeof(array)/sizeof(array[0]);
	printf("array的个数有:%d\n",size);
	
	for(data=0;data<size;data++)
	{
		printf("address:%p\n",&array[data]); //输出内存地址信息
		printf("data:%d\n",array[data]);
	}
	
	return 0;
}

补充:通过**sizeof(数组名)**可以求数组在内存中占用的字节数 。

 2、一维数组应用举例

2.1 一维数组的逆置(逆序输出)
/*
	数组的逆序输出
*/
#include <stdio.h>

int main()
{
	int a[] = {1,2,3,4,5,6,7,8,9,10};  //定义一个数组,同时初始化所有成员变量
	int i = 0;
	int j = sizeof(a)/sizeof(a[0])-1;
	int tmp;
	
	while(i<j)
	{
		tmp  = a[i];
		a[i] = a[j];
		a[j] = tmp;
		i++;
		j--;
	}
	
	for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	
	return 0;
}
2.2、删除一维数组中的指定元素
#include <stdio.h>

int main()
{
	int i;
	int j;
	int x;
	int a[] = {1,2,3,4,5,6,7,8,9,10};
	
	printf("请输入要删除的数\n");
	scanf("%d",&x);
	
	for(i=0;i<10;++i)
	{
		if(x==a[i])
		{
			for(j=i;j<9;++j){  //删除指定的数
				a[j] = a[j+1];
			}
			a[9] = 0;
			break;	
		}
	}
	if(i==10){
		printf("没有找到指定的数\n");
	}else{
		for(i=0;i<9;++i){ //输出删除后的数组
			printf("%d ",a[i]);
		}
	}
	return 0;
}
2.3、斐波那契数列
/*
	斐波那契数列(线性递推数列)
*/
#include <stdio.h>

int main()
{
	int array[30];
	int i;
	int arraySize;
	arraySize = sizeof(array)/sizeof(array[0]);
	
	array[0] = 0;
	array[1] = 1;
	
	for(i=2;i<arraySize;i++)
	{
		array[i] = array[i-1]+array[i-2];
	}
	
	for(i=0;i<arraySize;i++)
	{
		printf("%d \n",array[i]);
	}
	printf("\ndone\n");
	
	return 0;
}
2.3、冒泡排序法
/*
	冒泡排序法(从小到大)
*/
#include <stdio.h>

int main()
{
	int array[] = {12,34,45,56,76,87,98,100};
	int i,j,tmp;
	int ArraySize = sizeof(array)/sizeof(array[0]);
	
	for(i=0;i<ArraySize-1;i++)
	{
		for(j=0;j<ArraySize-1-i;j++){
			if(array[j] > array[j+1])
			{
				tmp = array[j];
				array[j] = array[j+1];
				array[j+1] = tmp;
			}
		}
	}
	for(i=0;i<ArraySize;i++)
	{
		printf("%d ",array[i]);
	}
	
	return 0;
}
/*
	冒泡排序法(从大到小)
*/
#include <stdio.h>

int main()
{
	int array[] = {12,34,45,56,76,87,98,100};
	int i,j,tmp;
	int ArraySize = sizeof(array)/sizeof(array[0]);
	
	for(i=0;i<ArraySize-1;i++)
	{
		for(j=0;j<ArraySize-1-i;j++){
			if(array[j] < array[j+1])  //修改此处的关系运算符就可改变输出排序是从大到小或者从小到大
			{
				tmp = array[j];
				array[j] = array[j+1];
				array[j+1] = tmp;
			}
		}
	}
	for(i=0;i<ArraySize;i++)
	{
		printf("%d ",array[i]);
	}
	
	return 0;
}

三、二维数组

1、二维数组的定义

(1)在实际应用中有许多数据是二维的,例如棋盘是有多行多列,如果使用C语言描述一个棋盘我们 需要使用二维数组。

(2)定义二维数组的语法规则

         数据类型  数组名[常量表达式1][常量表达式2];

         说明:

          1)我们可以将二维数组当作一个有行有列的二维 矩阵

          2)常量表达式1代表矩阵的行数

          3)常量表达式2代表矩阵的列数

          4)二维数组可以理解为由 “常量表达式1”个一维数组所组成的

(3)int a[3][4];

         数组a是一个有3行4列的二维数组,数组中元素的数据类型为int

2、二维数组的使用 

2.1二维数组也同样通过下标对数组中的元素进行访问,与一维数组不同的是,二维数组元素的访问
需要使用两个下标
(1)行下标的值从0 开始到“常量表达式1”-1
(2)列下标的值从0开始到“常量表达式2”-1
(3)通过双重循环访问二维数组中的元素
/*
	二维数组的使用(基本访问方法)
*/

#include <stdio.h>

int main()
{
	int a[2][3];
	int m,n;
	
	//一行一行的访问
	for(m=0;m<2;m++)
	{
		for(n=0;n<3;n++)
		{
			printf("%d",a[m][n]);
		}
		printf("\n");
	}
	
	//一列一列的访问
	for(m=0;m<2;m++)
	{
		for(n=0;n<3;n++)
		{
			printf("%d",a[n][m]);
		}
		printf("\n");
	}
	
	return  0;
}
/*
	二维数组的使用(二维数组的遍历)
*/

#include <stdio.h>

int main()
{
	int i,j,hang,lie;
	//定义一个3X4整型二维数组
	int arry[3][4] = {{11,22,33,44},{111,222,333,444},{1111,2222,3333,4444}};
	int max;
	
	for(i=0;i<3;i++)
	{
		for(j=0;j<4;j++){
			printf("%d \t",arry[i][j]);
		}
		printf("\n");
	}
	
	max = arry[0][0]; //最大的那个数,先记录第一个来比较的数字
	for(i=0;i<3;i++)
	{
		for(j=0;j<4;j++)
		{
			if(max < arry[i][j])  //如果记录的数比当前这个数小,那么重新记录这个数
			{
				max = arry[i][j];
				hang = i;
				lie = j;
			}
		}			
	}
	printf("其中在%d行第%d列的数%d最大\n",hang+1,lie+1,max);
	
	return  0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值