C语言基础知识之(六):数组-----数组类型、定义数组、读取数组、排序数组、字符串数组函数

一、数组简介

1、数组属于构造类型

2、什么是数组:具有相同数据类型的成员组成的一组数据

3、整型数组、浮点型数组、字符数组、字符串数组。数组前的修饰词表示数组中存储的成员数据类型。

二、定义数组

类型修饰符 数组名[常量表达式] = {值1,值2,值3,...};

说明:

1、类型修饰符:声明了成员的数据类型

2、[]中的值决定了数组中成员的数量

3、{}中设置数组中的成员

 

数组定义方式:

方式1,

定义整型数组,存数三个学生的年龄

int ages[3] = {18, 17, 20};

   

方式2

没有赋初值的成员系统自动设置为0.

int b[5] = {4, 5, 6};

   

方式3

没有赋初值的数组,系统自动默认数组元素全部为0.

int c[5] = {0};

   

方式4

根据初始化的数组元素个数,系统自动推断数组中成员的数量

int d[] = {7, 8, 9,10};

 

错误方式1

指定的数组成员数量 < 实际初始化成员的数量

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

   

错误方式2

理论上来说此种设置正确的,数组元素个数为1,初始值为1.但是如果在后面的程序中需要赋的值大于数组声明的元素个数,则会出现错误,不建议使用,故归为错误的定义方式。

int f[]= {0};

   

三、数组元素

1、数组元素:数组中的成员

2、数组下标:数组元素的序号。

  注:数组下标从0开始,即第一个元素的下标为0,后面的元素下标一次增加1。

  

3、数组所占的存储空间

元素个数 * 每个元素所占的字节数,数组的存储空间是连续的。

 

四、使用数组  

1、访问数组元素

a、不能通过数组名来一次性访问所有的数组元素

b、访问数组元素:通过 数组名[下标] 访问某个数组元素

c、下标可以使用常量或变量  

 

2、读取数组元素的值

   

int age[5] = {12,15, 20, 26};

   

printf("%d\n",age[0]);// 读取第一个元素中的值

printf("%d\n",age[3]);// 读取第四个元素中的值

   

3、遍历数组

按照顺序,从第一个元素开始访问,到最后一个元素结束。使用for循环实现数组遍历

   

for (int i = 0; i< 5; i++) {

     printf("%d ", age[i]);

}

    printf("\n");

   

反向遍历数组

   

for (int i = 4; i>= 0; i--) { // i自减

    printf("%d ", age[i]);

}

   

4、修改数组元素的值

   

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

a[0] = 19;

a[4] = 25;  

for (int i = 0; i< 5; i++) {

    printf("%d ", a[i]);

}

   

5、数组越界:使用数组下标时,超出下标范围

int a[10] = {0}; 下标范围 0~9, a[10]即为越界

    

注意:C语言中,编译器不会检测下标是否越界

6、注意事项:

a、区分定义数组和数组元素

b、数组作为一个整体,不能直接参与运算。数组名是一个符号常量,表示数组首元素的地址

 

例题:   

生成 2个数组,每个数组都有 10个元素 ,元素取值范围 20-40之间,数组对应元素相加,放到另外一个数组中。

   

int a[10] = {0};

int b[10] = {0};

int c[10] = {0};

   

for (int i = 0; i< 10; i++) {

      

      a[i] = arc4random() % 21 + 20;

      b[i] = arc4random() % 21 + 20;

      

      c[i]= a[i] + b[i];

     

      printf("%d", a[i]);

      printf("%d ", b[i]);

      printf("%d ", c[i]);

      

      printf("\n");//打印一次换行一次

 }

 

五、数组排序

1、排序的规律:升序、降序

2、冒泡排序的基本思路:每次将相邻的两个数进行比较,按照升序或降序的顺序进行交换,直到所有数字的顺序全部正确

3、冒泡排序需要两层循环实现

(1)外层循环  控制排序的趟数

(2)内层循环  控制每趟排序中,比较的次数

 

冒泡排序举例:

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

  

//    外层循环  控制比较趟数

for (int i = 0; i< 5-1; i++) {

//     内层循环 控制比较的次数

   for (int j = 0; j < 5-(i+1); j++) {

//   比较相邻的两个数,根据比较规则,实现排序

if (a[j] > a[j+1]) { // j即是数组元素的下标,也控制比较的次数

//a[j] > a[j+1],升序排列; a[j] < a[j+1],降序排列

     int temp = a[j];

     a[j] = a[j+1];

      a[j+1] = temp;

     }

   }

}

//遍历数组

for (int i = 0; i< 5; i++) {

    printf("%d ", a[i]);

}

 

例题:

获取字符中的最大值,并找出所在的位置

   

int b[5] = {1, 3, 5,8, 6};

int max = b[0];

   

int max = 0; 前提是数组中的元素必须全部是正整数

for (int i = 0; i< 5; i++) {

    if (max < b[i]) {

       max = b[i];

    }

}

printf("%d", max);

//找出最大值的位置

for (int i = 0; i< 5; i++) {

    if (b[i] == max) {

       int index = i;//获取最大值所在的下标

       printf("%d ", index+1);

    }

  }

 

六、字符数组

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

char b[10] = {'i','p', 'h', 'n', 'o', 'e'};

1、未设置初始值的元素,默认设置为‘\0’, '\0'是空操作符,不能显示

2、访问字符数组

   读取字符数组a中的第一个元素

printf("%c\n",a[0]);

   遍历数组b

for (int i = 0; i< 10; i++) {

     printf("%c ", b[i]);

}

   

七、字符串

1、字符串常量 “love” “helloworld”

2、使用%s实现输入输出字符串。

3、系统如何识别字符串。从第一个字符开始读取,知道遇见‘\0’结束。

4、‘\0’是字符串结束标志。

注意:使用字符数组存储字符串

字符数组在内存中是:n个连续的字符

字符串在内存中是:n个连续的字符

char name[] = "hello";

存储字符串的字符数组,元素个数 = 可见的字符数量+1

输出字符串

printf("%s", name);

 

八、字符数组和字符串数组关系

1、字符串是一个字符数组

     char a[] = "hello";

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

     a、b都是字符数组,两个数组中存储的都是字符串“hello”,都可以访问元素

    

2、字符数组 不一定是 字符串

     char a[] = "hello";

     char b[] = {'h', 'e', 'l', 'l', 'o'}; // 无'\0'字符

数组a中存储的是一个字符串,数组b中存储的是5个字符

    

3、如果数组中存储的是字符串,可以输出单个字符,也可以使用%s输出完整的字符串。使用%s输出时,遇到'\0'时即结束输出。

4、访问字符串中的元素

    char a[] = "hello";

    for (int i = 0; i < 6; i++) {

        printf("%c ", a[i]);

    }

printf("%s \n", a);

九、处理字符串的函数

1、strlen()测量字符串的长度

测量的是字符串中可见字符的数量,不包含‘\0’。Strlen返回值为unsigned long类型,输出使用%lu。

   

char name[] = "zhangsan";

   

printf("%lu\n",strlen(name));

printf("%lu\n",strlen("zhangsan"));  

2、strcpy 字符串拷贝  

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

拷贝字符串的时候需要将字符数组2中的'\0'也拷贝过去。

字符数组1的存储空间 >= 字符数组2的存储空间

 

char a[10] = {0};

char b[] = "zhangsan";

  

strcpy(a, b);

  printf("%s ", a);

for (int i = 0; i< 10; i++) {

    printf("%c ", a[i]);

}

   

3、字符串拼接

strcat(字符数组1, 字符数组2);将字符数组2中的内容拼接到字符数组1的内容后面

字符数组1的存储空间必须足够大

拼接之后,字符串1的'\0'被取消了,只保留字符串2的'\0'

   

char a[30] ="hello";

char b[] = "world";

   

strcat(a, b);

printf("%s\n",a);

   

4、字符串比较

strcmp(字符串1, 字符串2)

将两个字符串自左向右,逐个字符进行比较(按ASCII码值进行比较),直到出现不同的字符或者遇到‘\0’

用字符串1 - 字符串2

字符串1 = 字符串2, strcmp返回结果为0

字符串1 > 字符串2, strcmp返回结果大于0

字符串1 < 字符串2, strcmp返回结果小于0

 

char m[] ="abc";

char n[] ="abC";

   

printf("%d\n",strcmp(m, n));

printf("%d\n",strcmp(n, m));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值