所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
数组中的特定元素可以通过索引访问,第一个索引值为0
声明数组
type arrayName [arraySize];
//arraySize为常量,且数组大小可以写大了,但不能写小了。
eg: float X[5*5]; //合法
int a[10];
初始化数组
在C中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:
double balance[5]={1000.0,2.0,3.4,7.0,50.0};
大括号{}之间的值的数目不能大于我们在数组声明时在方括号[]中指定的元素数目。否则,会造成数据溢出。
如果您省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果:
double balance[]={1000.0,2.0,3.4,7.0,50.0};
您将创建一个数组,它与前一个实例中所创建的数组是完全相同的。但是,如果您既没有指定元素数目,又没有进行初始化,那么这个操作是不合法的:
int a[]; //不合法
下面是一个为数组中某个元素赋值的实例:
balance[4]=50.0;
上述的语句把数组中第五个元素的值赋为50.0
所有的数组都是以0作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去1
以下是上面所讨论的数组的图形表示:
初始化数组时没有得到初值的元素默认为0
int b[10]={9,8,7};
//b[0]=9,b[1]=8,b[2]=7,b[3]~b[9]=0
如果没有初始化数组,而是定义数组后再进行赋值,需要逐个进行赋值(您可以使用循环)。下面的操作是非法的:
int a[5];
a[5]={1,2,3,4,5};
//非法,在这里的a[5]是使用的数组元素
a[5]=5;
//非法,数组的下标是0~4
访问数组元素
数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后面。例如:
int salary=b[2];
上面的语句把数组b中第三个元素的值(7)赋给salary变量
下面的实例使用了上述的三个概念,即声明数组、数组赋值、访问数组。
#include<stdio.h>
int main(){
int n[10];
int i,j;
for(i=0;i<10;i++){
n[i]=i+100;
}
for(j=0;j<10;j++){
printf("Element[%d]=%d\n",j,n[j]);
}
return 0;
}
/*输出结果:
Element[0]=100
Element[1]=101
Element[2]=102
Element[3]=103
Element[4]=104
Element[5]=105
Element[6]=106
Element[7]=107
Element[8]=108
Element[9]=109
*/
可以使用循环进行数组元素的输入和输出:
for(int i=0;i<10;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<10;i++){
printf("%d",a[i]);
}
多维数组
我们在这里介绍二维数组,其他多维数组同理
type arrayName[x][y];
一个二维数组可以被认为是一个带有x行和y列的表格
初始化二维数组
int a[3][4]={
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
//等同于
int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
二维数组初始化时行数可以省略,列数不可以省略
思考一下为什么?
int arr[][3]={{1,2},{3,4}};
//给数组每行的前两个元素赋值,行数为2,每行最后一个元素为0
访问二维数组元素
二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。例如:
int val=a[2][3];
上面的语句将获取数组中第3行第4个元素
二维数组练习题:【洛谷】P1003[NOIP2011 提高组] 铺地毯(笔者有写)
二维数组距离
二维数组 a [ i 0 , j 0 ] ,其中有 a [ i 1 , j 1 ] , a [ i 2 , j 2 ] 二维数组a[i_0,j_0],其中有a[i_1,j_1],a[i_2,j_2] 二维数组a[i0,j0],其中有a[i1,j1],a[i2,j2]
数组距离 = ( i 2 ∗ j 0 + j 2 ) − ( i 1 ∗ j 0 + j 1 ) 数组距离=(i_2*j_0+j_2)-(i_1*j_0+j_1) 数组距离=(i2∗j0+j2)−(i1∗j0+j1)
相差的内存=距离*大小
数组和函数
传递数组给函数
涉及指针
方式1:形式参数是一个指针
void myFunction(int *param){}
方式2:形式参数是一个已定义大小的数组
void myFunction(int param[10]){}
方式3:形式参数是一个未定义大小的数组
void myFunction(int param[]){}
从函数返回数组
C语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。
如果您想要从函数返回一个一维数组,您必须定义一个返回指针的函数,如下:
int *myFunction(){}
另外,C不支持在函数外返回局部变量的地址,除非定义局部变量为static变量。
函数传递数组
#include<stdio.h>
void fun1(int arr[],int len){//一维数组
for(int j=0;j<len;j++){
printf("%d\t",arr[j]);
}
printf("\n");
}
void fun2(int arrr[][3]){//二维数组
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
printf("%d\t",arrr[i][j]);
}
printf("\n");
}
}
int main(){
int arr1[9]={1,2,3,4,5,6,7,8,9};
fun1(arr1,9);
int arr2[2][3]={1,2,3,4,5,6};
fun2(arr2);
return 0;
}
比较以下几种形参列表,在实际的代码中更改它们,看看输出会有不同吗?
void fun1(int arr[],int len){}
void fun1(int arr[9],int len){}
void fun1(int arr[11],int len){}
void fun1(int arr[7],int len){}
void fun1(int *arr,int len){}
在fun1函数中修改数组中元素的值再进行输出,以上几种形式,数组内元素的值都会被修改吗?
在进行实际操作后,相信你已经得出结论了,那么,为什么会这样呢?
在之后我们将学习【C语言】指针中"数组和指针"部分,那时候你就会明白了。
字符数组
C语言用字符数组存放字符串,字符数组中的各元素依次存放字符串的各字符
- 一维字符数组:存放一个字符串(每个数组元素存放一个字符)
- 二维字符数组:存放多个一维数组(字符串);二维数组的行数是字符串的个数
类型:char
char c[6]={'a','b','c','d','e','f'};
//定义一个字符数组c,并以单个字符初始化赋值
char s[7]="abcdefg";
//等同于char s[7]={"abcdefg"};
//定义一个字符数组s,并以字符串初始化赋值
//如有定义以下字符数组:
char s[10];
//方法一:以%c的格式循环输入输出
for(int i=0;i<10;i++){
scanf("%c",&a[i]);
}
for(int i=0;i<10;i++){
printf("%c",a[i]);
}
//方法二:以%s的格式输入输出
scanf("%s",a);
printf("%s",a);
字符数组的结束标志为’\0’,系统在字符数组初始化赋值时会自动在末尾加一个’\0’作为字符串的结束标志,'\0’会占用一个字符大小的内存。定义字符数组时至少需要多给一个。
中文字符的使用:一个汉字占两个字节
char ch[]="爱";//数组大小有3字节
printf("%s",ch);
通常定义将要使用的字符数组,放’\0’进行初始化
char str2[100]={'\0'};
空格、回车或制表(Tab)符是输入数据的分隔符,因而不能被读入,输入遇到这些字符时,系统认为字符串输入结束。
char str3[100]={'a','b','c','\0','d','e'};
printf("%s",str3);//输出结果:abc
//如果从键盘输入空格,效果也是一样的
那么输入的字符串有空格怎么办?
gets(str3);//从键盘上输入字符串,以回车结束
puts(str3);//输出字符串,将字符串全部输出并自带一个换行
#include<stdio.h>
int main(){
char name[3][10]={{"张三 你好"},{"李四你好!"},{"王五hello"}};
for(int j=0;j<3;j++){
puts(name[j]);
}
return 0;
}
以上的三个字符串都不能再添加内容,因为它们的字节上限是10
那"张三你好吗"行不行呢?这个问题留给你。
字符数组常用函数请看【C语言】字符串