【C语言】数组

所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。

数组中的特定元素可以通过索引访问,第一个索引值为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

以下是上面所讨论的数组的图形表示:

balance数组

初始化数组时没有得到初值的元素默认为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) 数组距离=(i2j0+j2)(i1j0+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语言】字符串

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值