一、数组
1、数组概念
(1)数组定义:数组是一段连续的内存区域,一组有序的、类型相同的数据的集合。换句话说,数组是用来存储多个类型相同的数据的数据结构。数组是数据的容器,而非数据本身。
(2)数组名:数组的名字,数组名代表数组的起始地址。数组名代表数组首地址,引用时可不必再加&,加也可以。
(3)数组元素:索引或下标标识,索引或下标从0开始。
(4)数组长度: 数组中元素的个数被称为数组的长度。只能是常量和常量表达式(大于0)。动态计算数组长度:sizeof(arr)/sizeof(arr[0]);
(5)数组在内存中的存放: 存放时先存放到低字节,再存到高字节。每个数据元素占用的字节数,就是基类型的字节数,一个整型数组元素占4个字节
(6)允许使用变量的地方都可以使用数组元素,可以使用整型表达式引用数组的元素:如–数组名[整型表达式]
普通变量赋值:int b; b=5;
数组变量赋值:int a[4]; a[2]=5;
(7)不能直接将一个数组赋给另一个数组,即不能为数组整体赋值。
二、一维整型数组
1、一维整型数组初始化
(1) extern和static数组元素自动初始化为0。
(2)数组初始化是在数组定义时给元素赋初值
(3)一般形式:类型 数组名[常量表达式]={值,值…};
数组初始化时注意点:
①元素之间用逗号隔开;如:int ary[10]={1,2,3};
②可以只给部分元素赋值,剩余元素赋0值;int ary[10]={0,1,2,3,4,5,6,7,8,9};
③给全部元素赋值时,可以不说明元素的个数;如:int ary[ ]={0,1,2,3,4,5,6,7,8,9}
④初始化的数据个数允许少于数组的长度,但不能多于数组的长度
printf ("%d", arr[10]); //越界
arr[10]=100; //可能引发错误
arr[12]=200; //可能引发错误
//超出数组的长度,将导致段错误或者覆盖其它变量。
⑤初始化没有显示指明初始值的元素,一律初始化为零。
int arr[10]={0}; //全部初始化为0
int arr[10]={}; //全部初始化为0
int arr[10]; //不做初始化
(5)一维数组初始化用法
①一般初始化
#include <stdio.h>
int main()
{
//数组初始化方式1
int ID[3];
ID[0]=1;//下标=数组元素个数-1
ID[1]=2;
ID[2]=3;
printf("%d%d%d\n",ID[0],ID[1],ID[2]);
//数组初始化方式2
int ID[3]={1,2,3};
printf("%d%d%d\n",ID[0],ID[1],ID[2]);
return 0;
}
② for循环初始化
#include <stdio.h>
int main()
{
char alpha[26];
int ary[10];
int i, j;
for(i = 65,j = 0; i < 91; i++,j++)
{
alpha[j] = i;
printf("The character is %c \n", alpha[j]);
}
for(i=0;i<10;i++)
{
printf("请输入整型数组元素初始值:");
scanf("%d",&ary[i]);
}
for(i=0;i<10;i++)
{
printf("ary数组元素值为:");
printf("%d\n",ary[i]);
}
return 0;
}
2、一维整型数组应用
(1) 输出一维整型数组元素的地址
#include <stdio.h>
int main()
{
int ID[3]={1,2,3};//数组初始化
int i;//i可先定义,在for循环内定义有可能报错
for(i=0;i<3;i++)
{
printf("%p\n",&ID[i]);//%p 表示输出的结果是指针(即变量的地址值)
}
return 0;
}
运行结果:
0019FF34
0019FF38
0019FF3C
结果说明,一个int数组元素占4字节,数组元素地址相差4Byte,若换为double型,则数组地址相差8Byte。
(2)输入一无符号整数num,要求通过计算,得到它的二进制方式,并输出在显示屏上(如输入10,结果:1010,不可直接调用除标准输入输出外的库函数)。
#include <stdio.h>
int main()
{
int a,buf[16],i=0;//定义数组,变量
printf("请输入十进制整数:\n");
scanf("%d",&a);//输入十进制整数
while(a>0)
{
buf[i++]=a%2;
a=a/2;
}
printf("输出二进制数:\n");
for(i--;i>=0;i--)//逆序输出
{
printf("%d",buf[i]);//输出二进制数
}
printf("\n");
return 0;
}
输出:
三、二维整型数组
1、概念
(1)定义:可看成是由两个一维数组组成的数组,类似于一个由行和列组成的表格。
定义:int a[2][3];
(2)存储形式:二维数组在内存中是按行的顺序存放的,即先存放第一行的元素,再存放第二行的元素。如下:
a00 a01 a02
a10 a11 a12
a20 a21 a22
2、二维整型数组的初始化
格式:数据类型 数组名[常量表达式1][常量表达式2]={初始化数据}
(1)分行给二维数组赋初值。
如: int a[2][3]={{1 , 2 , 3 } , { 4 , 5 , 6 }};//{1 , 2 , 3 }相当于1个一维数组
(2)可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。
如: int a[2][3]={1 , 2 , 3 , 4 , 5 , 6 };
(3) 可以对部分元素赋初值,未被初始化的数组元素将自动赋 0。
如:int a[3][4]={{1},{5},{9}};
如:int a[3][4]={{1},{0,6},{0,0,11}};//对各行中的某一元素赋初值
如:int a[3][4]={{1},{5,6}};//只对某几行元素赋初值。
(4)如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。
如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
等价:int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
(5)在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如:int a [][4]={{0,0,3},{},{0,10}};
(6)使用for循环初始化数组
#include <stdio.h>
int main( )
{
int a[3][3]={0};
int i=0,j=0,temp=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
a[i][j]=temp;
temp+=1;
printf("b[%d][%d]=%d ",i,j,temp-1);
printf("a[%d][%d]=%d ",i,j,a[i][j]);
}
printf("\n");
}
return 0;
}
运行输出:
b[0][0]=0 b[0][1]=1 b[0][2]=2
b[1][0]=3 b[1][1]=4 b[1][2]=5
b[2][0]=6 b[2][1]=7 b[2][2]=8
3、二维整型数组应用
int a[][3]={1,2,3,4,5,6,7,8,9};和int a[][4]={{1,2},{3,4,5,6},{7}};//数组为3行4列
引用格式:数组名[行下标][列下标] 例如:ary[1][3] = 12;
(1) 输出数组元素值
#include <stdio.h>
int main( )
{
int a[3][3]={0,1,2,3,4,5,6,7,8};
int i=0,j=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("b[%d][%d]=%d ",i,j,a[i][j]);
}
printf("\n");
}
return 0;
}
(2) 模拟登陆界面-多个账号明码登陆
#include <stdio.h>
#include <string.h>
int main()
{
char sn[2][5]={"admin","user"};
char sp[2][5]={"123","456"};
char name[5]={0};
char pwd[8]={0};
printf("请输入姓名:");
scanf("%s",name);
printf("请输入密码:");
scanf("%s",pwd);
if((strcmp(name,sn[0])==0)&&(strcmp(pwd,sp[0])==0))
{
printf("登录成功\n");
}
else if((strcmp(name,sn[1])==0)&&(strcmp(pwd,sp[1])==0))
{
printf("登录成功\n");
}
else
{
printf("登录失败\n");
}
return 0;
}
编辑 2020-04-24 23:37 首次编辑
修改 2021-07-03 23:38 内容结构修改
注:本文旨于作为自己的学习笔记,不作他用。