Linux-C P6 数组

Linux-C P6 数组

在这里插入图片描述
本章来讲解数组,C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合(关于数据结构后面会单独开一个系列)

数组是用来存储一系列数据,但它往往被认为是一系列相同类型变量

如果学过线性代数,一定不会陌生,数组其实跟矩阵很相似

通过思维导图可以了解到,数组分为一维数组多维数组字符串,最后通过两个案例来深入了解数组

一维数组

在这里插入图片描述

什么是一维数组

一维数组是指只有一个下标的数组,也被称为线性数组

定义形式

<存储类型> <数据类型> <数组名>[<常量表达式>]

存储类型:指的是auto、register、static、extern

数据类型:可以是任一种基本类型或构造数据类型

数组名:用户定义的数组标识符

常量表达式:数据元素的个数,也称为数据的长度


关于定义数组需要注意的
(1)数组的类型实际上是指数组元素的取值类型;对于同一个数组,其所有元素的数据类型都是相同

一般形式

int a[10];

(2)数组名应当符合标识符命名规则,且不能与其他变量名相同

(3)数组的长度必须常量,不能够是变量,在定义的时候就需要确定下来

#define MAX 100

main(){
    int a =100;
    
    int b[100];         //定义正确,100是常量
    int c[a];            //定义错误,a是一个变量
    int d[MAX;]      //定义正确,MAX是宏定义的一个常量
}

(4)在同一个类型说明中说明多个数组和多个变量

初始化和引用

初始化

定义好之后,就应该给数组赋值

数组赋值有好几种方式

方式一

定义在main函数里的不初始化数组,数组中的元素的值是不确定的

#iclude <stdio.h>
   main(){
    int a[10];
}

方式二

static 存储类型或者全局变量不初始化数组中的元素的值都默认为0

#iclude <stdio.h>
    int b[10];
main(){
    static int a[10];
}

方式三

全部初始化,各自赋值给对应的数值,注意数组的第一个变量是用a[0]来表示的,也就是a[0]为1

int a[5] = {1,2,3,4,5};

也可以给出其长度,获取到初始值之后自动获取数组长度

int a[] = {1,2,3,4,5};

方式四

部分初始化,没进行初始化的赋值为0

int a[5] = {1,2};

方式五

数组全部初始化为0

int a[5] = {0}

单独赋值

如果想要单独进行赋值,或者改变元素的值,该怎么做呢?

int a[5];
int b =10;
a[0] = 5;
a[1] = b;

可以直接进行重新赋值,赋值的内容可以直接是对应的类型,也可以是对应类型变量

引用

数组里的各个元素有了内容之后该怎么使用呢?

这里就要对数组进行引用,但是数组一般的变量引用是不一样的,数组必须逐个元素引用

int a[5] = {1,2,3,4,5};
printf("%d\n",a[0]);

这样的话只会输出a[0]的内容,也就是1,如果要输出全部内容可以用for循环

int a[5] = {1,2,3,4,5};
for(int i = 0;i < 5;i++){
    printf("%d\n",a[i]);
}

接下来,可以将上面的定义初始化赋值引用结合在一起,把数组应用于代码中

举个栗子

还是进行加法运算,只不过这次不是有序的,而是随机的值

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	int a[10] = {12,53,16,8,62,73,92,15,2,46};
	int i,s = 0;

	for(i = 0;i < 10;i++){
		s += a[i];
	}

	printf("sum = %d\n",s);	

	return 0;
}

在这里插入图片描述

经过运算得到累加值,也就是379

多维数组

在这里插入图片描述

具有两个或两个以上下标的数组,就被称为多维数组

一般比较常用的是二维数组,更高维度的数组用到的比较少

二维数组

基本形式

<存储类型> <数据类型> <数组名>[<常量表达式>][<常量表达式2>]

存储类型:指的是auto、register、static、extern

数据类型:可以是任一种基本类型或构造数据类型

数组名:用户定义的数组标识符

常量表达式1:数据元素的个数,也称为数据的长度

常量表达式2:数据元素的个数,也称为数据的长度


初始化

对于二维数组初始化也有许多种方式,这里一一进行介绍

方式一

不进行赋值,根据类型不同跟一维数组一样

int a[5][5];

方式二

全部进行赋值,分为降维赋值线性赋值两种,降维赋值更好理解,在大括号里的每个括号的代表维度一,维度里的是维度一里的内容;而线性赋值是按存储顺序进行依次赋值

降维赋值:进行分维度的赋值

int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

线性赋值:直接进行同维度的线性赋值

int a[3][3] = {1,2,3,4,5,6,7,8,9};

方式三

局部进行赋值,没有赋值的默认为0

int a[3][3] = {{1},{2},{3}};

方式四

省略下标赋值,这里一维的下标可以省略,而二维的下标不行

int a[][3] = {{1,2,3},{4,5,6}};

方式五

C99新增的指定元素初始化赋值其他的元素默认为0

int a[3][4] = {[0][0] = 1, [1][1] = 2, [2][2] = 3};

多维数组

多维数组的基本形式

<存储类型> <数据类型> <数组名>[<常量表达式>][<常量表达式2>]....[<常量表达式n>]

存储类型:指的是auto、register、static、extern

数据类型:可以是任一种基本类型或构造数据类型

数组名:用户定义的数组标识符

常量表达式1:数据元素的个数,也称为数据的长度

常量表达式2:数据元素的个数,也称为数据的长度

常量表达式n:数据元素的个数,也称为数据的长度

字符数组及字符串

在这里插入图片描述

字符数组

定义
有一定顺序关系的若干个字符型变量就是字符数组

字符数组可以是一维的也可以是多维

char c[5];

初始化

方式一

char c[5] = {'h','e','l','l','o'};

方式二

char c[5] = {"hello"};

字符串

定义

字符串指的是以’\0’作为结束字符一组字符,在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串

初始化

方式一

char c[] = {'h','e','l','l','o','\0'};

方式二

char c[] = {"hello"};

举个栗子

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	char s[] = "Hello World";

	printf("%s\n",s);
	return 0;
}

在这里插入图片描述

字符串处理函数(简单介绍)

这里需要调用string.h头文件(详细内容,可参见头文件string.h),这里只对函数做简要介绍

字符串拷贝函数strcpy

内容
函数名称strcpy
所需头文件#include <string.h>
函数原型char *strcpy(char *dest,const char *src);
函数功能字符串拷贝函数,将src字符串的内容拷贝到dest里
函数传入值*dest:指被复制字符串的首地址
*src:指复制字符串的首地址
函数返回值*dest

举个栗子

在这里插入图片描述

#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[])
{
	char s1[50];
	char s2[] = "Hello World";

	strcpy(s1,s2);

	printf("s1 = %s,s2 = %s\n",s1,s2);

	return 0;
}

在这里插入图片描述


字符串比较函数strcmp

内容
函数名称strcmp
所需头文件#include <string.h>
函数原型int strcmp(const char *s1,const char *s2);
函数功能按照ASCII码顺序比较字符串s1和字符串s2的大小
函数传入值s1,s2是要比较字符串的起始地址
函数返回值s1=s2 :返回值0
s1>s2: 返回值大于0
s1<s2:返回值小于0

举个栗子

在这里插入图片描述

#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[])
{
	char s1[50] = "abc";
	char s2[50] = "abd"; 
	
	if(strcmp(s1,s2) == 0){
		printf("s1 == s2\n");
	}else if(strcmp(s1,s2) > 0){
		printf("s1 > s2\n");
	}else{
		printf("s1 < s2\n");
	}

	return 0;
}

在这里插入图片描述


strlen

内容
函数名称strlen
所需头文件#include <string.h>
函数原型int strlen(const char *s);
函数功能求字符串的长度
函数传入值*s:要求长度的字符串
函数返回值字符串的长度

举个栗子

在这里插入图片描述

#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[])
{
	int len;
	char s[50] = "hfjsdkhfkjsdhf";

	len = strlen(s);
	printf("%s ,len = %d\n",s,len);
	return 0;
}

在这里插入图片描述

项目案例

在这里插入图片描述

一维数组实现冒泡排序

#include <stdio.h>

int main(int argc, const char *argv[])
{
	static int a[10];
	int i,j,k;

	printf("请输入需要排序的内容:\n");

	for(i = 0;i < 10;i++){
		printf("a[%d] = ",i);
		scanf("%d",&a[i]);
	}

	for(i = 0;i < 9;i++){
		for(j = i+1;j < 10;j++){
			if(a[i] < a[j]){
				k = a[j];
				a[j] = a[i];
				a[i] = k;
			}
		}
	}

	printf("排序后的结果为:\n");

	for(i = 0;i < 10;i++){
		printf("a[%d] = %d\n",i,a[i]);
	}

	return 0;
}

在这里插入图片描述

二维数组实现矩阵相乘

#include <stdio.h>

#define M 2
#define N 2
#define P 3

int main(int argc, const char *argv[])
{
	int a[M][P] = {{1,2,3},{4,5,6}};
	int b[P][N] = {{1,4},{2,5},{3,6}};

	int c[M][N] = {0};

	int i,j,k,row;

	for(i = 0;i < M;i++){
		for(j = 0;j < N;j++){
			for(k = 0;k < P;k++){
				c[i][j] += a[i][k] * b[k][j];
			}
		}
	}

	row = M > P ? M : P;
	
	for(i = 0;i < row;i++){
		printf("|  ");
		for(j = 0;j < P;j++){
			if(i < M){
				printf("\b%d ",a[i][j]);
				printf("|");
			}else{
				printf("\b\b\b      ");	
			}
		}

		if(i == row / 2){
			printf(" * ");
		}else{
			printf("   ");
		}
		printf("|  ");

		for(j = 0;j < N;j++){
			if(i < P){
				printf("\b%d ",b[i][j]);
				printf("|");
			}else{
				printf("\b\b\b      ");
			}
		}

		if(i == row / 2){
			printf(" = ");
		}else{
			printf("   ");
		}

		printf("|  ");
		for(j = 0;j < N;j++){
			if(i <M){
				printf("\b%d ",c[i][j]);
				printf("|");
			}else{
				printf("\b\b\b      ");
			}
		}
		printf("\n");
	}
	return 0;
}

更多内容

Linux-C P1 Linux基础与Vi操作

Linux-C P2 数据类型

Linux-C P3 运算符和表达式

Linux-C P4 输入输出

Linux-C P5 控制语句

Linux-C P7 指针

Linux-C P8 函数

Linux-C P9 内存管理

Linux-C P10 结构体细讲

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CagePan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值