概述
数组
1.定义
把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组。
- 数组属于构造数据类型
- 按数组元素类型分为:数值数组、字符数组、指针数组、结构数组等
- 所包含的数据叫做数组元素
- 同一数组,所有元素的数据类型都相同
- 整个内存地址连续,每个数据元素所占空间大小相同
2.数组类型说明
类型说明符 数组名 [常量表达式],……;
-
类型说明符:任一种基本数据类型或构造数据类型
int a[10] 整数类型,有十个元素;
float b[10] 实数类型b,有十个元素; -
数组名:用户自己定义的数组表示符
-
[常量表达式]:数据元素的个数,即为数组长度,但是其下标从0开始计算。因此5个元素a[5]:a[0],a[1],a[2],a[3],a[4]
-
数组名不能与其他变量名相同,
void main()
{
int a;
float a[10];//与上边的整数a名字相同,不 合法
} -
方括号里不能用变量来表达元素个数,但可以是符号常数,或常量表达式。
#define FD 5
void main()
{
int a[3+2],b[7+FD]; //合法int n=5;//不合法
int b[n];
} -
允许在同一个类型说明中,说明多个数组和多个变量:int a,b,c,d,n1[10],n2[20];
3.表示方法
数组名 [下标]
- 下标表示元素在数组中的数组中顺序号,小数将会自动取整
- 只能逐个使用下标变量,可以使用循环语句逐个输出,但不能一次引用整个数组
printf("%d",a[i]); // 合法
printf("%d",a);//错误
4.赋值
1)初始化赋值
static 类型说明符 数组名[常量表达式] ={值,值……};
static int a[10] = {0,1,2,3,4,5,6}
- static 可以不写,表示的是静态储存类型,规定只有静态储存数组和外部储存数组才可初始化赋值
- {}里边为各元素初值,各值之间逗号隔开
- 可以只给部分元素赋初值,即当{ }中值的个数少于元素个数,只给前面部分赋值,后边值不够的元素自动赋值为0.但如果没有给可初始化的数组赋初值,则全部元素均为0
- 只能逐个赋值不能整体赋值。
int a[5]={1,1,1,1,1}; //合法
int a[5]=1;//不合法 - 如果给全部元素赋值,则在数组说明中,可以不给数组元素个数。
int a[3]={1,2,3};
int a[ ]={1,2,3};
2) 动态赋值
用循环语句配合scanf函数逐个对数组元素赋值
//输出一个数组,数组数组中最大的数组元素
void main()
{
int i,max,a[10];
printf("input 10 numbers: n");
for(i=0;i<10;i++) //动态对数组逐个赋值
{
scanf("%d",&a[i]);
}
max = a[0]; //先设置一个初始的的最大值以供比较
for(i=1;i<10;i++) //将10个数组元素逐个比较
{
if(a[i]>max)
{
max = a[i];
}
}
printf("maxnum=%dn",max); //输出最大数组元素
}
例题
//输入一个数组,然后从大到小按序输出
void main()
{
int i,j,p,q,s,a[10]; //定义一个含是个数据元素的整数型数组
printf("n input 10 numbers:n");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]); //这个for循环动态逐个输入10个数据
}
for(i=0;i<10;i++)
{ //这个循环对于对比大小进行排序
p=i;
q=a[i];
for(j=i+1;j<10;j++) //从比i大一个下标的数据元素开始对比截至到最后一个元素
{
if(q<a[j]) //如果下一个比当前的大,就会把最大的数据元素赋值给q,直到q得到最大那一个数据元素
{
p=j;
q=a[j];
}
}
if(i!=p) //如果为1,说明已经从上边的循环中对比出来获得当前最大值,然后进行下边的交换,把最大值放在最前边进行输出,然后i+1用下一个开始进入循环对比。
{
s=a[i];
a[i]=a[p];
a[p]=s;
}
printf("%d ",a[i]);
}
}
5.二维数组
1) 定义
类型说明符 数组名 [常量表达式1] [常量表达式2];
int a[3] [4]; 说明了一个三行四列的数组,数组名为a,数据类型为整数型
- 常量表达式1表示第一位下标长度,常量表达式2表示第二维下标长度
- 存储按行或者按列排列,C语言中二元数组按行排列,即才存完a[0]行,再存a[1]行,每行的四个元素也是一次存放的。
- 多维数组可参照二维进行理解
2) 表示方法
数组名 [下标] [下标]
a [3] [4] 表示a数组三行四列的元素
3) 二维数组初始化
按行分段赋值
按行连续赋值
int a [4] [3] ={ {13,7,9} , {11,62,71} ,{58,16,70} , {5,8,91} }
或者
int { 13,7,9,11,62,71,58,16,70,5,8,91 }
- 只对部分元素赋初值,未赋值的元素自动取0
- 如果会全部元素赋初值,则第一位的长度可以不给出。int a[ ] [3] ={1,2,3,4,5,6,7,8,9};
6.字符数组
1)定义
存放字符量的数组,说明形式与前边相同
-
字符型与整形通用
-
可以多维
-
可以初始化赋值
char c [3]={’ c ‘,’ a ‘,’ o '} -
未全部赋值剩下自动赋0值,全部赋值时可省去长度说明
2) 赋值
初始化赋值除了普通方式还可以用字符串的方式对数组赋值
char c []={’ I ‘, ’ ’ , ’ l’,’ o ', v ', ’ e ', ’ ', ’ i ', ’ t '};
可写为:
char c []={“I love it”};
或者
char c[] =“I love it”;
- 这种方式比逐个赋值多占一个字节 ’ ',这是C编译系统自动加上作为结束标志。
除了初始化赋值外也可以循环语句逐个赋值
3) 二维字符串数组
char a [n] [m] 表示n个长度不大于m的字符串
- 数组是n*m个数字,字符则表示 为 n个字符串
4) 字符串的输入和输出
printf("%c",c[n][m]); //输出第n行第m列的元素,这是一个单个字符
scanf ("%c",&c[n][m]); //输入第n行第m列的元素,这是一个单个字符
printf("%s",c[n-1]); //输出第n行的字符串
scanf("%c",c[n-1]); //输入第n行一个字符串
5) 字符串常用的函数
puts (字符数组名) :把字符数组中的字符串输出到显示器
gets(字符数组名) :输入一个字符串
strcat (字符数组1,字符数组2) :把 字符数组2的字符串连接到字符数组1字符串后边
strcpy (字符数组1,字符数组2) :把字符数组2中的字符串拷贝到字符数组1中。串结束标志也一同拷贝
strlen(字符串组名) :测字符串实际长度,不含结束标志
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
char st1[30] ="My name is ";
char st2[10];
char st3[30];
int k;
printf("input your name:n");
gets(st2); //读取st2
puts(st2); //输出刚获得的st2
strcat(st1,st2); //把st2合并到st1中
puts(st1); //输出合并后的st2
strcpy(st3,st2); //把st2复制到空的st3中
puts(st3); //输出复制后的st3
k=strlen(st2); //计算出st2的真实长度
printf("The lenth of the st2 is %dn",k);
}
结构数组和指针数组,会在总结指针和结构的时候穿插进去这里就不再介绍
最后用一到简单的练习题结束吧
#include <stdio.h>
#include <stdlib.h>
//把一个整数按大小顺序插入已排好的数组中
void main()
{
int i,j,p,q,s,n,a[11]={24,42,34,54,2,33,56,6,59,11};
printf("该数组从大到小排序为:");
for(i=0;i<10;i++) //将该数组从大到小排序
{
p=i;
q=a[i];
for(j=i+1;j<10;j++)
{
if(q<a[j])
{
p=j;
q=a[j];
}
}
if(p!=i)
{
s=a[i];
a[i]=a[p];
a[p]=s;
}
printf("%d ",a[i]);
}
printf("n请输入你所要加入排序的整数: n");
scanf("%d",&n);
for(i=0;i<10;i++)
{
if(n>a[i]) //从头到尾与新插入的进行比较,一旦碰见比它小的便进入if
{
for(s=9;s>i;s--) //把从比它小的那个位置整体向后移动,给新元素流出位置
{
a[s+1]=a[s];
}
break;
}
}
a[i]=n;//把新元素插入留出的位置,这里的i必须采用静态储存
printf("加入新元素之后的数组顺序为:");
for(i=0;i<=10;i++)
{
printf("%d ",a[i]);
}
}
最后
以上就是粗犷世界为你收集整理的C语言基础:数组数组的全部内容,希望文章能够帮你解决C语言基础:数组数组所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复