文章目录
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;
}