C语言:数组的概念 您所在的位置:网站首页 c语言使用冒泡排序对数组进行排序 C语言:数组的概念

C语言:数组的概念

2023-07-10 17:45| 来源: 网络整理| 查看: 265

目录 前言一、一维数组1.1 数组的创建1.2 数组的初始化1.3 数组的使用1.4 数组的存储 二、二维数组2.1 二维数组的创建2.2 二维数组的初始化2.3 二维数组的使用 三、数组作为函数传参3.1 关于数组名3.2 冒泡排序

前言

这一小节呢,开始对C语言的数组进行讲解,从一维数组开始出发,接着讲解二维数组,对数组的概念进行一个简单的认识。

一、一维数组 1.1 数组的创建 所谓数组,数组就是一组相同类型的元素的集合。数组的创建方式如下所示: type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n 是一个常量表达式,用来指定数组的大小

数组创建的实际例子:

//代码1 int arr1[10]; //代码2 int count = 10; int arr2[count];//数组时候可以正常创建? //代码3 char arr3[10]; float arr4[1]; double arr5[20];

需要注意的一点:当我们创建数组的时候,[ ]里面必须要给一个常量值才可以表示,不可以使用变量。在C99之后才支持变长数组的概念,数组的大小可以使用变量指定,但是数组不可以初始化。

1.2 数组的初始化 数组的初始化:就是在数组创建的同时给数组里面的内容设定一些合理的初始值。

举个例子就是:

int main() { int arr1[10]; // 创建一个大小为10的int类型数组 char arr2[20]; // 创建一个大小为20的char类型数组 float arr3[1]; // 创建一个大小为1的float类型数组 double arr4[] = {0}; // 创建一个不指定大小的double类型数组(需要初始化) return 0; }

字符数组的初始化

int main() { char ch1[5] = {'b', 'i', 't'}; char ch2[] = {'b', 'i', 't'}; char ch3[5] = "bit"; // 'b', 'i', 't', '\0', '0' char ch4[] = "bit"; // 'b', 'i', ''t, '\0' return 0; }

字符数组初始化的两种写法:

如果字符数组带上双引号 " " 一般会自己带上 \0 。 花括号内部需要自己加上 \0 。

int main() { char ch5[] = "bit"; // b, i, t, \0 【自带斜杠0】 char ch6[] = {'b', 'i', 't'}; // b i t 【不自带斜杠0】 printf("%s\n", ch5); printf("%s\n", ch6); return 0; }

没有 \0的时候,strlen读取的字符的时候不会知道什么时候结束,strlen:遇到 \0的时候就会自动停止。

int main() { char ch5[] = "bit"; // b, i, t, \0 【自带斜杠0】 char ch6[] = {'b', 'i', 't'}; // b i t 【不自带斜杠0】 printf("%d\n", strlen(ch5)); printf("%d\n", strlen(ch6)); return 0; }

在这里插入图片描述 当然,如果我们手动加上一个 \0的话,这样子就不会是随机值了;

int main() { char ch5[] = "bit"; // b, i, t, \0 【自带斜杠0】 char ch6[] = {'b', 'i', 't', '\0'}; // b, i, t, + '\0' 【手动加上斜杠0】 printf("%d\n", strlen(ch5)); printf("%d\n", strlen(ch6)); return 0; }

这样的话,运行的结果就是3 3了。

1.3 数组的使用

下标引用操作符:[ ] ,即数组访问操作符;

来举一个简单的例子来看一看就知道了:

打印一组数组

int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; for(i = 0; i 0}; int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); for(i = 0; i int arr[3][4] = {1,2,3,4,5}; /* 1 2 3 4 5 0 0 0 0 0 0 0 */ int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; // 完全初始化 int arr2[3][4] = {1,2,3,4,5,6,7}; // 不完全初始化 - 后面补0; int arr3[3][4] = {{1,2}, {3,4}, {4,5}}; // 指定; /* 1 2 0 0 3 4 0 0 4 5 0 0 */ return 0; }

关于“行可以省略,但是列绝对不可以省略”

int main() { int arr1[][] = {{2,3}, {4,5}}; // error int arr2[3][] = {{2,3}, {4,5}}; // error int arr2[][4] = {{2,3}, {4,5}}; // √ return 0; } 2.3 二维数组的使用

我们在打印二维数组的时候,同样是通过下标的方式,只不过相对于一维数组来说,在打印二维数组的时候一般利用两个for循环。

int main() { int i = 0; int j = 0; for (i = 0; i int arr[3][4]; int i = 0; int j = 0; for(i = 0; i int arr[10] = {0}; printf("%d\n", sizeof(arr)); return 0; }

最后输出的结果是 >> 40

3.2 冒泡排序

在这里插入图片描述 冒泡排序的核心思想:相邻的两两元素进行比较,如果满足条件则交换;

先确认总共需要的趟数;写下来一趟冒泡排序的过程;最后进行交换;

需要注意的一些点:

int arr [ ] 本质是来讲依然是指针,int * arr;数组在传递参数的时候,实际上传递的是数组的首元素地址;sz变量不能够在函数内部计算,需要在外部计算好了之后再传递进去;

例子:编写一个bubble_sort( ) 函数,升序排列,int arr [ ] = {9,8,7,6,5,4,3,2,1,0}

#include void bubble_sort (int arr[], int sz) // 形参arr本质上是指针 int* arr { /* 确认趟数 */ int i = 0; for(i = 0; i /* 如果前面数比后面数大,就交换 */ if(arr[j] > arr[j + 1]) { /* 创建临时变量交换法 */ int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } } int main(void) { int arr[] = {9,8,7,6,5,4,3,2,1,0}; int sz = sizeof(arr) / sizeof(arr[0]); /* 冒泡排序 */ bubble_sort(arr, sz); // 数组传参的时候,传递的是首元素的地址 /* 打印数组 */ int i = 0; for(i=0; i int j = 0; int falg = 1; // 标记1,假设这一趟冒泡排序已经有序 for(j = 0; j int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; flag = 0; // 仍然不有序,标记为0 } } if(flag == 1) break; // 已经有序了,就不需要再冒泡排序了 } } int main(void) { int arr[] = {9,8,7,6,5,4,3,2,1,0}; int sz = sizeof(arr) / sizeof(arr[0]); /* 冒泡排序 */ bubble_sort(arr, sz); /* 打印数组 */ int i = 0; for(i=0; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有