一:一维数组
1:定义:将相同类型变量组合到一起,并按顺序排列,形成一个集合(用于存储单一数据类型的集合,不能把不同类型的数据放在同一个一个数组中)
格式:类型名 数组名[常量表达式]----int a[10] (元素、下标)
注:不允许用变量来制度数组长度(int arr[len]) 错--int len=5;对
2:定义数组 @1:定义全部 int a[10]={0,1,2,3,4,5,6,7,8,9} (int a[ ]错误)
@2:定义部分 int a[10]={5}
@3:定义元素为0 int a[10]={0}
3:使用数组: n=a[5] // a[5]=n ( int n=5; int a[n];--错误)
4:对数组进行赋值:int [10]
借助循环方式: eg: int a[10]正确方式 a[10]={0}错误方式
5:数组初始化的几种错误形式
初始化数组的值的个数不能多于数组元素个数,初始化数组的值也不能通过跳过逗号的方式来省略。
例如,下面的代码对数组进行初始化是错误的:
int arrayl[5]={1,2,3,4,5,6}; //error: 初始化值个数多于数组元素个数
int array2[5]={1,,2,3,4}; //error:初始化值不能省略
int array3[5]={1,2,3,}; //error:初始化值不能省略
int array4[5]={}; //error:语法格式错误
@1:eg:逆序输出5个数:58946
int main()
{
int a[5]={5,8,9,4,6};
int i,t;
for(i=0;i<=5/2;i++)
{
t=a[i];
a[i]=a[5-1-i];
a[5-1-i]=t;
}
for(i=0;i<5;i++)
printf("%d",a[i]);
printf("\n");
}
@2:eg:输出数列前40个数
#include <stdio.h>
main()
{
int a[40],i;
a[0]=a[1]=1; //前两项不需要计算,直接初始化为1
for(i=2;i<40;i++)
a[i]=a[i-2]+a[i-1]; //a[2]=a[0]+a[1]
for(i=0;i<40;i++)
printf("%d\t",a[i]); //\t表示按表格类型输出1
}
二:二维数组
1:一般形式:类型说明符 [常量表达式] [常量表达式]
eg: int a[1][2],b[3][4] 下划线处代表一维数组名。
2:在c语言中,二维数组中的元素排列的顺序是按行存储:即在内存中先存放第一行的元素,再存放第二行的元素。
3:二维数组元素的表现形式:数组名[下标][下标] - -
注:在引用数组元素时,下标值应在已定义的数组大小的范围内。
eg: int a[2][3] //定义a为2*3的二维数组 .......a[3][4]=3 //不存在与数组中的元素
(定义数组时的a[3][4]和引用数组元素时的a[3][4]是不同的概念//前者用a[3][4]定义数组的维数和各维的大小,后者中的3.4
是数组元素的下标值,代表行序列和列序列的元素)
4.二维数组中给全部元素赋值时,对一维的长度可以不指定,但第二维的长度必须指定。
@1: eg: int a[ ] [3]={2,4,6,8,10,12] 等价于 int a[2][3]={2,4,6,8,10,12} 或 int a[2][3]={{2,4,6},{8,10,12}}
int arr6[2][]={ 4,8 };//这样是不对的,必须指定二维的长度
int arr6[2][]={ 4,8 };//这样是不对的,必须指定二维的长度
int arr6[][]={{4,5},{5,6,7}};
@2: eg: char ch[6]='china';
printf("%s",ch)
eg: int a[2][3]={{0,4},{8}} ------a[0][0]=0; a[0][1]=4 ;a[1][0]=8; ------- (0 40) (80 0)
eg: int a[3][4]={{1},{5},{9}}; ------- 1 0 0 0 ; 5 0 0 0; 9 0 0 0 ;
@1:定义二维数组,每个元素都初始化
int a[2][3]={{1,2,3},{4,5,6}};
int b[3][2],i,j;
printf("array a:\n");
for(i=0;i<=1;i++)
{
for(j=0;j<=2;j++)
{
printf("%5d",a[i][j]);
b[j][i]=a[i][j];
}
printf("\n");
}
printf("array b:\n");
for(i=0;i<=2;i++)
{
for(j=0;j<=1;j++)
printf("%5d",b[i][j]);
printf("\n");
结果:
@2:二维数组互换元素
#include<stdio.h>
int main()
{
int a[2][3]={{1,2,3},{4,5,6}};
int b[3][2],i,j;
printf("array a:\n");
for(i=0;i<=1;i++)
{
for(j=0;j<=2;j++)
{
printf("%5d",a[i][j]);
b[j][i]=a[i][j];
}
printf("\n");
}
printf("array b:\n");
for(i=0;i<=2;i++)
{
for(j=0;j<=1;j++)
printf("%5d",b[i][j]);
printf("\n");
}
return 0;
}
结果:
三:字符数组(以字符的ASCII代码存储在存储单元中,一般占一个字节)
字符数组中的一个元素存放一个字符。定义字符数组的方法与定义数值类型数组的方法类似。
1:字符数组的定义
* 数组名属于标识符,遵循标识符命名规则。
** 数组名后面是[ ]括起来的常量表达式。
*** 常量表达式可以包含常量和符号常量,不能包含变量。
eg: char ch[10];--- (一个字符型数组,内存为10) ----- 可以为其赋值 int char[10]={'a','b','c','d','e','f','j','h','i',' '}
* 一维字符数组中存放一个字符串,比如一个名字char name[20] = "mj"
* 如果要存储多个字符串,比如一个班所有学生的名字,则需要二维字符数组,char names[15][20]可以存放15个学生的姓名(假设姓名不超过20字符)
* 如果要存储两个班的学生姓名,那么可以用三维字符数组char names[2][15][20]
2.字符串数组两种表示:
第一种:char str[4][6] = {"aaa", "bbb", "ccc"}; //char类型的二维数组
第二种:char *str[4] = {"aaa", "bbb", "ccc"}; //char*类型的一维数组
#include<stdio.h>
int main()
{char c[5]={'h','a','p','p','y',};
int i;
for("%c",c[i]);
printf("\n");
return 0;
}
3.字符串和字符串结束标志
*一个字符串的结束标志是以字符 "\0"作为结束标志。
*用字符数组存储字符串常量的时候,常常会自动加一个"\0"作为结束标志。
4.字符数组的输入与输出
*逐个字符输入输出:用格式符“%c"
*将整个字符串一次输入或输出用”%s"格式符
eg: char c[ ]={“China'};
printf(“%s\n",c);
5.注意
* 输入的字符中不包括结束符‘\0'
* 用'%s'格式符输出字符串时,Printf函数中的输出项是字符数组名,而不是数组元素名。(eg:printf("%s",c[0]); 就是错误表达)
* 如果数组长度大于字符串的实际长度,也只能输出到与'\0'结束。( eg: char c[10 ]={“China'}; printf(“%s",c);
*如果一个字符数组中包含一个以上'\0',则遇到第一个'\0'时输出就结束。
*可以用scanf函数输入一个字符串。 ( eg: scanf("%s",c); )
*scanf函数中的输入项如果是字符数组名,就不再加地址符& (eg: scanf("%s',&str); 错误)
#include <stdio.h>
void main()
{
char a[50];
int i=0;
gets(a);
while(a[i])
{
if(a[i] >= 'A' && a[i] <= 'Z')
a[i] += 32;
else if(a[i] >= 'a' && a[i] <= 'z')
a[i] -= 32;
i++;
}
puts(a);
}