数组特点:

  1. 数组是一组有序数据的集合
  2. 用一个数组名和下标表示一个元素
  3. 数组中的所有元素都属于同一个数据类型

6.1 怎样定义和引用一维数组

6.1.1 怎样定义一维数组

语法:

类型符 数组名[常量表达式] 如:

int a[10];

说明:

  1. 数组命名规则与变量名相同,遵循标识符命名规则。
  2. 定义数组是,需要指定长度。
  3. 常量表达式可以包括常量和符号常量
  4. 数组在内存中是一片连续的空间。

在非主函数中定义数组,其长度可以是变量或非常量表达式。

如果指定数组为静态存储方式,则不能用“可变长数组”。如:

static int a[2*n]

6.1.2 怎样引用一维数组和元素

引用数组元素的表示形式:

数组名[下标]

注意:

下标可以是整形常量或整形表达式。

​ a[0]=a[5]+a[7]-a[2*3];

数组下标范围是0到(定义长度-1)

# include <stdio.h>
int main()
{
    int a[10],i=9,j=0;
    for(;j<10;j++)
        a[j]=j;
    for(;i>=0;i--)
        printf("a[%d]=%d\n",i,a[i]);
    return 0;
 } 

6.1.3 一维数组的初始化

  • 定义数组时对全部元素赋值

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

  • 可以给数组一部分元素赋值。

    int a[10]={0,1,2,3}; //系统给后续元素赋值为0

  • 如果想使一个数组中元素值为0,可以写成

    int a[3]={0,0,0}; 或 int a[3]={0};

6.1.4 一维数组程序举例

# include <stdio.h>
/*
    利用数组来实现斐波那契数列 
*/

int main ()
{
    int a[20]={1,1};
    int i,j;
    for(i=2;i<20;i++)
    {
        a[i]=a[i-1]+a[i-2];
    } 
    for(i=0;i<20;i++)
    {
        printf("a[%d]=%d\n",i,a[i]);
    }
    return 0; 
}
#include<stdio.h>
/*
     用一维数组实现冒泡排序 
*/ 
int main()
{
    int a[5]={1,6,7,8,5};
    int i,j=0,temp=0;
    for(i=0;i<5;i++)
    {
        for(j=0;j<5-i;j++)
        {
            if(a[j]>a[j+1])
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;    
            }

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

6.2 怎样定义和引用二维数组

二维数组常称矩阵

6.2.1 怎样定义二维数组

二维数组定义的一般表现形式

类型说明符 数组名[常量表达式] [常量表达式];

如:

float a[3] [4],b[4] [5];

定义a为3行4列的数组,b为5行10列的数组。

C语言对二维数组的定义.png

C语言中二维数组中元素的排列的顺序是按行存放的,即在内存中存放第一行的元素,接着再存放第二行的元素。

内存中中的个元素是连续存放的,不是二维的,是线性的

多维数组的定义.png

6.2.2 怎样引用二维数组

二维数组元素的表示形式为

数组名[下标] [下标] 下标应是整形表达式(对常量使用运算符连接进行运算)

6.2.3 二维数组的初始化

  1. 分行给二维数组赋初值分行给二维数组赋值.png
  2. 可以,将所有数据卸载一个花括号内,按数组元素在内存中的排列顺序对个元素赋值。将数据写在一个花括号内.png
  3. 可以对部分赋值。没有赋值的部分,系统会自动赋值为0对部分元素赋值.png
  4. 如果对全部元素都赋值,则定义数组是对第一维长度可以不指定,但第二维的长度不能省。全部元素赋值省略第一维长度.png

6.2.4 二维数组程序举例

# include <stdio.h>
/*
    二维数组元素互换 
*/
int main()
{
    int a[2][3]={1,2,3,4,5,6};
    int b[3][2];
    int i,j;
    for(i=0;i<2;i++)
    {
        for(j=0;j<3;j++)
        {
            b[j][i]=a[i][j];
        }
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<2;j++)
        {
            printf("%d\t",b[i][j]);
        }
        printf("\n"); 
    }
    return 0;
}
# include <stdio.h>
/*
    找出二维数组中最大的数 
*/
int main()
{
    int a[2][3]={1,2,3,4,5,6};
    int max=a[0][0],i,j;
    for(i=0;i<2;i++)
        for(j=0;j<3;j++)
        {
            if(a[i][j]>max)
                max=a[i][j];
        };
    printf("max=%d",max);
    return 0;
}

6.3 字符数组

6.3.1 怎样定义字符数组

char c[10];

c[10]=’3’;

因为字符型数据是以ASCII码存放的,因此,也可以用整形数组存放字符

6.3.2 字符数组的初始化

一次将各个字符赋值给数组中各元素。

部分赋值元素,剩余没有赋值的部分被系统自定义为空字符 ‘\0’

不赋值,默认是null 即 ‘\0’

6.3.3 怎样引用字符数组中的元素

可以引用字符数组中一个元素,得到一个字符。

6.3.4 字符串和字符串结束的标志

在C语言中是将字符串作为字符数组来处理的。

C语言规定了一个“字符串结束的标志”,以null 即’\0’ 作为结束标志。

如果字符数组中存有若干个字符,前9个字符都不是空字符,而地10个是’\0’ ,它的有效字符为9个,也就是说遇到字符’\0’时,表示字符串结束,把它前面的字符组成一个字符串。

null字符的位置决定了字符数组的长度,或是字符串的长度。

字符数组初始化一种方法:使用字符串常量来使字符数组初始化。

如:char c[]={“i am student.”};也可以省略花括号

​ char c[]=”i am student.”; 空字符也是字符串的长度的一部分,字符串的长度还要加一个空字符的位置。

​ char c[]=”i am student.”;等价于a[] 与d[]不一样

​ char a[]={‘i’,’ ‘,’a’,’m’,’ ‘,’s’,’t’,’u’,’d’,’e’,’n’,’t’,’.’,’\0’};

​ char d[]={‘i’,’ ‘,’a’,’m’,’ ‘,’s’,’t’,’u’,’d’,’e’,’n’,’t’,’.’};

说明:字符数组并不要求它的最后一个字符为null,甚至可以没有null

​ 但为了处理方法一致,便于测定字符串的实际长度,在字符数组中加一个’\0’.便于引用字符数组中的字符串。

6.3.5 字符数组的输入输出

字符数组的输入输出:

1.逐个字符输入输出,用格式符 %c 输出或输入一个字符

2.将整个字符串一次输入或输出。用%s格式符

​ 如: char c[]={“chair”};

​ printf(“%s\n”,c);

说明:

  1. 输出字符不包括’\0’

  2. 使用%s时,printf函数中输出项是字符数组名,而不是数组元素名。

  3. 如果数组长度大于字符串时,当检测到null时结束

  4. 当数组中包含多个null是,遇到第一个null输出结束

  5. 可以用scanf函数输入一个字符串。如:scanf(“%s”,c);

    scanf函数输入项是字符数组名,不需要使用地址符,因为在C语言中数组名代表该数组的起始位置。

  6. printf(“%s\n”,c); 执行过程,找到数组名c的起始位置,然后逐个输出其中的字符。直到遇到null 即’\0’时停止

6.3.6 使用字符串处理函数

puts函数 输出字符串的函数

puts(字符数组) 作用是将一个字符串(以’\0’结束的字符序列)输出到终端。

gets函数 输入字符串的函数

gets(字符数组) 目的是向字符数组输入一个字符串

注意puts和gets函数只能输出或输入一个字符串

strcat函数 字符串连接函数

strcat(字符数组1,字符数组2),作用是将两个字符串连接起来

说明:

  1. 字符数组1必须足够大,才能容纳连接后的新字符串。
  2. 连接后,字符串1的’\0’取消,只保留字符串2的’\0’

strcpy和strncpy 字符串复制函数

strcpy(字符数组1,字符串2) 将字符串2复制到字符数组1

说明:

  1. 字符数组1的长度要等于或大于字符串2
  2. 字符数组1必须是数组名,字符串2既可以是字符数组名,也可以是一个字符串常量。
  3. 字符串2会替换掉字符数组1前字符串2的字符,剩余的不变
  4. 不能使用赋值语句将一个字符串常量或字符数组直接给一个字符数组。只能使用strcpy函数将字符串赋值到另一个字符数组里去。
  5. 可以使用strncpy函数将字符串2前面n个字符赋值到字符数组1去。 strncpy(字符数组1,字符串2,几个字符);

strcmp函数 字符串比较函数

strcmp(字符串1,字符串2) 比较字符串1和字符串2 比较的是内容是值

说明:

  1. 比较规则:将两个字符串自左到右逐个字符相比(按ASCII码值进行比较)直到出现不同字符或遇到’\0’为止
  2. 全部字符相同,则认为两个字符串相等;
  3. 如果出现不相同字符,则以第一对不相同的字符比较结果为准。
  4. 不能直接使用数组名比较字符串,只能用strcmp函数进行比较

strcmp的返回值

  1. 0代表两个字符串相等
  2. 正整数表示字符串1>字符串2
  3. 负整数表示字符串1<字符串2

strlen 函数 测试字符串长度的函数

strlen(字符数组);

函数的值为字符串的实际长度,不包括’\0’

strlwr函数 转换为小写

strlwr(字符串);

将字符串中大写字母转换为小写。

strupr函数 转换为大写

strupr(字符串);

将字符串中小写字母转换为大写。

库函数是由编译系统提供,不同的编译系统提供的函数可能不同。

在使用字符串处理函数是,应当在程序文件的开头用#include<string.h>

6.3.7 字符数组应用举例

看书上