有关于数组的小结

数组概念:
数组:具有相同类型数据组成的序列,数组是有序数据的集合,数组中的每一个数据称数组元素,数组中的每一个元素都属于同一个数据类型(由其所在的位置序号即数组元素下标来区分)。数组有下限,有上限(由电脑系统,内存等综合决定)。
数组元素
数组中的每一个数据称
下表变量
注意:数组元素有序不是指元素大小顺序,而是存储位置的有序
在c语言中,数组属于构造数据类型。一个数组可以分解成多个数组元素,这些数组元素可以是基本数据类型或是构造类型。按其类型不同,数组又可分为数值数组,字符数组,指针数组,结构数组等。

7.1 一维数组的定义和引用
定义:类型说明符 数组名[常量表达式]; 数组长度
例如:int a[10];
它表示定义了一个整形数组,数组名为a,此数组中有10个元素,10个元素都是整形变量!
注意:
类型说明符:是一种任何基本数据类型或构造数据类型,即数组中每个元素的所属类型(void空类型不能用来定义数组),除了void都可以。同一个数组,其所有元素的数据类型相同。
补充:
#include<stdio.h>
int main()
{
int(*p[10])(int);
printf("%d\n", sizeof§);
return 0;
}

数组名:遵循标识符命名规范。
数组长度:只能是正整型常量或是常量表达式;其表明该数组元素的个数。
允许在同一个类型说明中,说明多个数组和多个变量:int a,b,c1[5],c2[8];
下标的合法取值范围:[0,数组长度-1],下表始终是从0开始的,下表可以是变量或标量表达式。
常量表达式中可以包含常量或符号常量,但不能是变量。即c语言不允许对数组的大小作动态定义,数组的大小不依赖于程序运行过程中变量的值。
错误示范:
int n;
Scanf(“%d”,&n);//在程序中临时输入数组的大小
int a[n];
错误示范:
fioat a[0];数组大小为0没有意义;
int a(10); 不能使用圆括号;
int k,a[k]; 不能用变量说明数组大小

数组必须先定义,然后使用。c规定只能逐个引用数组元素而不能一次引用整个数组。
数组元素是组成数组的基本单元,其也是一种变量,其标识方法为数组名后跟一个下标。下标表示元素在数组中的顺序号。
一般形式:
数组名 [下标]
下标可以是整型常量或常量表达式。例如:a[i+j],a[i++],a[0]=a[5]+a[7]-a[3*2]
注意:
数组元素通常称为下表变量。必须先定义数组,才能使用下表变量。在c中只能逐个使用下标变量,不能一次引用整个数组。例:输出有10个元素的数组必须使用循环语句逐个输出各下标变量。
for(int i=0;i<10;i++)
{
printf(“%d,”,a[i]);
}
不能用一个语句输出整个数组,错误示范:
printf(“%d,”,a);
定义数组时用到的“数组名[常量表达式]”和引用时用到的“数组名[下标]”是有区别的。例:int a[10];定义了一个数组长度为10的整形变量a;t=a[6];引用a数组中序号为6的元素,此时6不代表数组长度。
关于一维数组初始化
给数组赋初值除了用赋值语句对数组元素逐个赋值外,还可采用初始化赋值和动态赋值的方法。
数组初始化赋值是指在数组定义时给数组元素赋以初值。初始化是在编译阶段进行的。(减少运行间,提高效率)
一般形式:类型说明符 数组名 [常量表达式]={值,值,值…值};
1>在定义数组时对数组元素赋初置。
2>可以只给一部分元素赋值,未初始化元素以位模式清零。
3>若想使一个数组中的全部元素值为0,可以写成:a[5]={0,0,0,0,0};或者a[5]={0};
4>在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例:int a[5]={1,2,3,4,5};可以鞋城int a[]={1,2,3.4.5};但是若数组长度与提供初值的个数不相同,数组长度不能省略。
程序举例:
1>利用数组来处理fibonacci数列。
fibonacci数列公式:a1=a2=1,an=an-1+an-2(1,1,2,3,5,8,13…);

#include<stdio.h>
void main()
{
	int a[20];
	for (int i = 0; i < 20; i++)
	{
		if (i <= 1)
		{
			a[i] = 1;
		}
		else
		{
			a[i] = a[i - 1] + a[i - 2];
		}
	}
	for (int i = 0; i < 20; i++)
	{
		printf("%d,", a[i]);
	}
}

2>用起泡法对10个数列排序(升序):起泡法思路是将相邻两个数比较,将小的调在前面。

int main()
{
	int a[] = { 6,4,7,3,0,8,5,2,9,1 };
	int len = sizeof(a) / sizeof(a[0]);
	int t;
	for (int i = 0; i < len - 1; ++i) //进行9次循环,实现九趟比较
	{
		for (int j = 0; j < len - i - 1; ++j) //在每一趟中实现9-i次比较
		{
			if (a[j] > a[j+1])  //相邻的两个数比较
			{
				t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
			}
		}
	}

	for (int i = 0; i < len; ++i)
	{
		printf("%d,", a[i]);
	}
	puts("\b;");
	return 0;
}

7.2 二维数组的定义和引用
定义:
一般形式:类型说明符 数组名 [常量表达式][常量表达式];例如:float a[3][4],b[5][10];
即定义了a为34(3行4列)的数组,b为510(5行10列)的数组。不能写成float a[3,4];
可以将二维数组看成是一种特殊的一维数组:其元素又是一个以为数组。a看作是一个一维数组,有三个元素a[0],a[1],a[2],每个元素又是一个包含4个元素的一维数组(可以用树形图描述)。
引用:
二维数组元素的表示形式:数组名 [下标][下标] ;例:a[2][3]。下标可以是整形表达式
初始化:
1>分行给二位数组赋初值。int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};比较直观,按行赋初值。
2>可以将所有数据写在一个花括号内,按数据排列的顺序对各元素赋初值。Int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};容易遗漏,不易检查。
3>可以对部分元素赋初值,未初始化的元素以位模式清零。Int a[3][4]={{1},{5},{1,9}};
4>若对全部元素都赋初值(提供全部初始数据),则定义数组时对第一维的长度可以不指定,第二维的长度不能省。
程序举例:
1>将一个二维数组a进行转置,存放到另一个二维数组b中去。

#include<stdio.h>
void main()
{
	int a[3][4];
	int b[4][3];
	int len1 = sizeof(a) / sizeof(a[0]);
	int len2 = sizeof(a[0]) / sizeof(a[0][0]);
	for (int i = 0; i < len1; i++)
	{
		for (int j = 0; j < len2; j++)
		{
			a[i][j] = i*len2 + j;
		}
	}
	for (int i = 0; i < len1; i++)
	{
		for (int j = 0; j < len2; j++)
		{
			printf("%-3d,",a[i][j]);
		}
		printf("\n");
	}
	printf("************************");
	puts("");
	for (int i = 0; i < len1; i++)
	{
		for (int j = 0; j < len2; j++)
		{
			b[j][i]=a[i][j];
		}
	}
	for (int i = 0; i < len2; i++)
	{
		for (int j = 0; j < len1; j++)
		{
			printf("%-3d,", b[i][j]);
		}
		printf("\n");
	}
}

7.3 字符数组
含义:用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。例如:char c[10];
初始化:
逐个将字符赋给数组中各元素:char c[10]={‘i’,‘’,‘a’,‘m’,‘’,‘a’,‘’,‘b’,‘o’,‘y’};
用字符串常量使字符数组初始化。
如果花括号中提供的初值个数(字符个数)大于数组长度,按语法错误处理,小于数组长度,将字符赋值给数组前面的那些元素,其余的元素自动定义为空字符(‘\0’)。
7.4 字符串和结束标志
在c中将字符串作为字符数组处理,字符串作为一堆数组存放在内存中。字符串的实际长度等于数组长度。规定‘\0’作为字符串的结束标志。即在遇到‘\0’,表示字符串结束,由它前面的字符组成字符串。
根据‘\0’的位置来判定字符串是否结束,不依靠数组的长度来决定字符串长度。在执行printf函数时,每输出一个字符检查一次,看下个字符是否是‘\0’,遇到‘\0’停止输出。
7.5 字符数组的输入输出
字符数组的输入输出有两种方法:
1>逐个将字符输入输出。用格式符“%c”输入或输出一个字符;
2>将整个字符串一次输入或输出。用格式符“%s”,即对字符串(string)的输入输出。
注意:
1>输出字符不包括结束符(\0)。
2>用“%s”输出字符串时,printf函数中的输出项是字符数组名,不是数组元素名。例:printf(“%s”,c[0]);
3>如果数组长度大于字符串实际长度,也只输出到遇‘\0’结束。
4>遇到一个及以上‘\0’,在第一个遇到的‘\0’结束输出。
7.6 字符串处理函数
1.puts函数(字符串输出函数)
一般形式:puts(字符数组)
作用:输出一个字符串(以‘\0’结束的字符序列)。

2.gets_s函数(字符串输入函数)
一般形式:gets_s(字符数组)
作用:从终端输入一个字符串到字符数组函数。

3.strcat(字符串连接函数)
一般形式(字符数组1,字符数组2) 数组1要足够大
作用:把两个字符数组中的字符串连接起来(字符串1在前,字符串2在后)。结果放在字符数组1中。

4.strcpy,strncpy(字符串复制函数)
①strcpy
一般形式:strcpy(字符数组1,字符串2)
字符数组1必须足够大,且必须写成数组名形式(str1),字符串2可以是变量,字符数组名,字符串常量。
作用:将字符串2复制到字符数组1中。
②strncpy
一般形式:strncpy(字符数组1,字符串2,n(字符个数))
作用:将字符串2中前n个字符复制到字符数组1中。

5.strcmp(字符串比较函数)
一般形式:strcmp(字符串1,字符串2)
作用:比较字符串1和字符串2。
规则:将两个字符串中的字符从左至右逐个相比(按ASCII码大小相比),直到出现不同的字符或遇到’\0’为止。
比较结果由函数值带回:
(1)字符串1=字符串2,函数值为0。
(2)字符串1>字符串2,函数值为一个正整数。
(3)字符串1<字符串2,函数值为一个负整数。

6.strlen()寻找第一个‘\0’前的字符
一般形式:strlen(字符数组)
测量字符串的实际长度。(不包括’\0’)

7.strlwr(转化为小写的函数)
一般形式:strlwr(字符串)

作用:将字符串中的大写字母转化为小写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值