知识分享:C语言知识干货系列——数组篇
bigegpt 2024-09-22 00:49 59 浏览
前面了解了c 语言的基础部分,下面在对它进行一个深入的了解吧!
数组
1,一维数组
数组是用来干嘛的呢?就像我们之前所说的变量一样,它是用来存储数据的。那它和变量存储数据有什么不同呢?
显然一个变量只能保存一份数据,在程序数据量小的情况下,使用起来比较方便。但是对于大规模的数据,单纯的变量就有点单薄了,对付大规模的数据,我们需要更强大的数据类型,将众多的变量凝聚在一起,也就构成了数组。
简单的来说,数组就是同一类型数据的集合,下面就是定义的简单数组并对其进行初始化:
int a[5]={10,20}; //部分初始化
int a[5]={[4]=20,[2]=10} //指定初始化
float c=['A'];
int m,g[10]; //若数组和变量的类型一致,可以放在一起定义
下面通过一个综合的小案例来加深一下对数组的基本操作。
//要求:由用户输入5个整数,保存到数组中,并按逆序打印所有元素。程序如下:
#include<stdio.h>
int main(){
int i,a[5];
printf("Please enter 5 integers:\n");
for(i=0;i<5;++i)
scanf("%d",&a[i]); //将i作为下表值,给数组元素赋初值
printf("Print array elements in reverse order:\n");
for(i=4;i>=0;--i)
printf("%d",a[i]); //将i作为下标值,打印数组元素值
return 0;
}
最后呢,对于数组的操作我们一定要切记不要越界访问,以免访问到数组之外的内存区域。
2,数组作为函数参数
C 语言允许将数组作为函数的参数,即可以将数组名作为函数的实参进行传递。可以在参数名后面加上中括号的形式,表示该参数是一个数组类型。如下就是一个以数组为参数的函数PArray:
void PArray(int arr[]){
for(int i=0;i<5;i++){
arr[i]*=10;
printf("%d ",arr[i]);
}
}
3,字符数组
C 语言中,几乎所有的数据类型都可以被定义为数组。由于数组可以用来存储字符串,因此字符数组在C 语言中的运用极为广泛。
虽然C 语言中没有字符串这种数据类型,但它的运用却极为普遍,比如我们入手的第一个程序"hello world"。注意到,它是用双引号括起来的一段字符序列。另外,字符串还有一个重要的特征:字符串必须以空字符(用转义字符'\0'表示)作为结尾。即使是字符串常量,也会隐含地拥有这个空字符。例如:
"abc" //这个字符串是由4个字符构成的,即字符a、b、c以及空字符,它的大小为4个字节
那我们是否会想,如何才能将"abc" 这个字符串存储到数组中呢?
//方法1:字符式存储
char str[4]={'a','b','c','\0'}; //全部初始化方式
char str[4]={'a','b','c'}; //鉴于空字符的ASCII码值为0,也可采用部分初始化的方式
//方法2:字符串式存储
char str[4]="abc";
//在实际编程中为了避免数组的长度不够这样的问题,我们通常建议采用下面这种方式进行赋值:
char str[]="abc";
在看了上述方法2之后,可能我们就在想如何才能得到一个字符串的长度是吗?
对于字符串,它除了有大小之外,还有长度的概念。我们这里就简单的区分一下:
字符串的大小指的是字符串所占内存的字节数,使用sizeof()库函数计算得出,而字符串长度则是指字符串中有效字符的个数,用strlen()库函数计算得出。所谓有效字符,就是除去作为结尾标记的空字符以外的字符。
4,二维数组
啊,五环,你比六环少一环~,顾名思义,二维数组就是在一维数组的基础上多了一维,简单的说就是多了一个"[ ]"。
至于对二维数组的初始化,与一维数组的初始化类似,下面就提一下行初始化方式:
float score[3][3]={
{88.5,86.5,96}, //第1行
{88.5,86.5,96}, //第2行
{88.5,86.5,96}, //第3行
}
前面说过一维数组可以作为函数参数,那类比一下,二维数组肯定也可以作为参数来进行函数调用。与一维数组作为函数参数时需要在参数名跟上一对中括号类似,二维数组需要两对中括号,其中第一对中括号用于表示第一维的大小,其值可以被省略,即使用空中括号形式;第二对中括号用于表示第二维的大小,其值不可被省略,即必须指明第二维的大小。下面是一个打印二维数组所有元素的函数例子:
void printScore(float s[][4],int len){
for(int i=0;i<len;i++){
for(int j=0;j<4;j++)
printf("%6.2f",s[i][j]); //以6字符宽度、保留2位小数的格式打印
printf("\n"); //打印一行元素后进行换行
}
}
最后,我们可以用这样的思想来理解一下C 语言中的数组:
由普通元素(变量)构成的数组,是一维数组,即一维数组是普通元素(变量)的数组。
由一维数组构成的数组,是二维数组,即二维数组是一维数组的数组。
由二维数组构成的数组,是三维数组,即三维数组是二维数组的数组。
.......
理解了数组的嵌套,再去理解指针与数组的关系,就会比较轻松了 ~ ~
实践中回顾(总结)
理解并掌握数组,会为后面的知识扩展打下坚实的基础。而真正掌握数组不能光靠理论知识,而是要更多的去实践,比较经典的题目有矩阵转置和冒泡排序,下面就用一个经典的冒泡排序算法的实现来对数组的知识进行回顾。
编写程序,在数组中保存1~100的10个随机整数,对数组进行升序排序,并将排序后的数组元素打印输出,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//冒泡排序
void bubble(int a[], int len) {
int i, j, tmp;
//1外层循环会执行 len - 1 次,表示共进行 len - 1 轮的比较过程
for (i = 0; i < len - 1; ++i) {
/*内层循环用于完成每一轮的比较过程。 它会从待排序序列中的第一个元素开始,逐个和后面的元素进行比较。另外, 随着外层循环中i 值的不断自增,表达式“len - 1-i”会使内层循环的 执行次数逐渐减少,这相当于把每轮完成后的最大值元素从待排序序列中排除*/
for (j = 0; j < len - 1 - i; ++j) {
if (a[j]> a[j + 1]) //检查前一个元素是否比后一个元素大 //如果是,就进行两个元素的值的互换
{
tmp = a[j]; //将前一元素值赋给 tmp
a[j] = a[j + 1];//将后一个元素值赋给前一个元素
a[j + 1] = tmp;// 将 tmp 值赋给后一个元素
}
}
}
}
int main() {
int i, arr[10]; //设置随机数种子
srand(time(NULL)); //通过循环获取 10 个随机数,并将其保存到数组arr中
for (i = 0; i < 10; ++i)
arr[i] = rand() % 100 + 1; //调用 bubble 函数进行冒泡排序,参数 1 为数组 arr,参数 2 为数组arr 的长度
bubble(arr, 10);
//打印输出排序后数组中的各元素值
for (i = 0; i < 10; ++i)
printf("%d ", arr[i]);
return 0;
}
好了,经过上面的回顾,大家是否对C 语言中的数组有了一个更深的印象了呢?
持续分享中······
作者:博客园丨Charmchin
写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
编程学习书籍分享:
编程学习视频分享:
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!
- 上一篇:Python多维数组构建与初始化
- 下一篇:巧用C语言中数组部分元素初始化
相关推荐
- Dify「模板转换」节点终极指南:动态文本生成进阶技巧(附代码)Jinja2引擎解析
-
这篇文章是关于Dify「模板转换」节点的终极指南,解析了基于Jinja2模板引擎的动态文本生成技巧,涵盖多源文本整合、知识检索结构化、动态API构建及个性化内容生成等六大应用场景,助力开发者高效利用模...
- 我用C#造了个AI程序员:自动调试+重构代码实战
-
在软件开发的世界里,调试和重构代码往往占据了程序员大量的时间。我一直梦想着能有一个智能助手,帮我处理这些繁琐的工作。于是,我决定用C#打造一个AI程序员,让它具备自动调试和重构代码的能力。系统架构设计...
- 公文自动排版vba代码(公文自动排版vba代码)
-
Sub公文自动排版()'设置页面参数(单位:厘米)WithActiveDocument.PageSetup.TopMargin=CentimetersToPoints(3.7)...
- Anthropic最强代码神器:Claude Code系统提示词
-
最近,在融合Opus-4之后,ClaudeCode的整体能力直线飙升.甚至一度把曾经的最强开发工具——Cursor打的抬不起头来。无论是代码生成的准确度,还是智能补全的丝滑体验,都让人印象深...
- 使用 Ruff 进行 Python 代码格式化与静态检查
-
随着Python项目的规模增大,保持一致的代码风格和高质量的代码变得尤为重要。Ruff是一个现代、高性能、支持lint和格式化的Python工具,能帮助你快速发现并修复常见代码问题。本文...
- 基础语法篇:格式化输出 含完整示例代码
-
所谓格式化输出就是按照一定格式来输出对应的内容,在Python的语法中格式化输出包含两种:格式化符号、格式化字符串一、格式化符号常用的格式化符号包括%s(将内容转换为字符串,放入占位位置)、%d(将内...
- 代码整洁如诗!Keil 插件上线,一键格式化代码,告别风格混乱!
-
引言:代码格式不统一?你的团队还在为“括号位置”吵架吗?嵌入式开发者们,你是否经历过这些抓狂瞬间?代码风格“百花齐放”:同事的代码缩进用空格,你的用Tab,合并时冲突频发!手动调整耗时费力:为了通过C...
- [信捷PLC] 信捷PLC之C函数编程(一)
-
前言写PLC程序,越来越觉得结构化文本编程语言(ST)给PC编程带来的便利,在处理一些数据上,可以写的更加灵活。所以,在项目PLC选型上,我都会优先选择支持结构化文本的PLC。国内有些厂商推出了一些较...
- C语言-HelloWorld解析(c语言的helloworld怎么写)
-
使用VisualStudio2017开发工具新创建一个项目,编写第一个C语言程序。#include<stdio.h>voidmain(){printf("HelloW...
- VSCode 配置 C++ 开发环境!教程详解
-
第一步、安装VSCode应用程序打开VSCode官网,下载对应安装包并默认安装(这里指明:安装路径可以修改)第二步、安装相关插件此时的VSCode仅仅是一个英文文本编辑器,还称不上开发工具,所以需要...
- C语言进阶教程:C语言与汇编语言交互
-
C语言和汇编语言的交互是底层编程和性能优化中的一个重要方面。理解它们如何协同工作,可以帮助开发者更好地控制硬件、优化关键代码段以及理解编译器的行为。为什么需要在C语言中嵌入汇编?尽管C语言已经提供了相...
- C语言如何处理平台相关代码(c语言的开发平台)
-
在进行跨平台C编程时,不可避免地会遇到需要针对不同操作系统或硬件架构编写特定代码的情况。C语言通过预处理器指令,特别是条件编译指令,为我们提供了处理平台相关代码的有效机制。最常用的就是利用预定义的宏(...
- C语言:hello world(c语言helloworld代码)
-
环境:a.初学者建议用“啊哈C”,这款软件简单易装;b.devc.visualstdiod.Vc6.0第一行代码:#include<stdio.h>#<stdio.h&g...
- C语言之编译器集合(编写c语言编译器)
-
C语言有多种不同的编译器,以下是常见的编译工具及其特点:一、主流C语言编译器1.GCC(GNUCompilerCollection)特点:开源、跨平台,支持多种语言(C、C++、Fortran...
- 适合零基础初学者学习C语言第一课教程,揭开C语言的神秘面纱
-
一、C语言简介我刚接触编程,首先想要学习的就是C语言,这次我就把我的感悟用我自己理解的文字表述出来,这样对刚学C语言的人来说,才是比较友好的。因为我们都没有C语言的基础,不懂啥是编程,啥事代码。我们...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- linux安装minio (74)
- ubuntuunzip (67)
- vscode使用技巧 (83)
- secure-file-priv (67)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)