当前位置: 首页 > news >正文

C语言基础(六)

一维数组:

C语言中的数组是一种基本的数据结构,用于在计算机内存中连续存储相同类型的数据。
数组中的每个元素可以通过索引(或下标)来访问,索引通常是从0开始的。

数组的大小在声明时确定,并且之后不能改变(除非使用动态内存分配技术,如指针和malloc/free等)。如果初始化时省略数组的大小,编译器会自动根据初始化列表中元素的数量确定数组的大小。

数组索引越界是C语言中常见的错误。如果尝试访问数组边界之外的元素,程序会崩溃或产生不可预测的行为。
数组的大小在编译时确定,且固定不变。如果需要动态改变数组大小,应考虑使用指针和动态内存分配。
数组名在表达式中通常被当作指向数组首元素的指针。但是,数组名本身并不是一个指针变量,而是一个常量表达式,其值为数组首元素的地址。

测试代码1:

#include <stdio.h>  
int main() {  // 定义并初始化一个整型数组  int numbers[5] = {1, 2, 3, 4, 5};  // 访问并打印数组中的每个元素// 数组下标从0开始	for(int i = 0; i < 5; i++) {  printf("numbers[%d] = %d\n", i, numbers[i]);  }  // 修改数组中的某个元素  numbers[2] = 10; // 将索引为2的元素(即第三个元素)修改为10  // 再次访问并打印修改后的数组元素  printf("After modification:\n");  for(int i = 0; i < 5; i++) {  printf("numbers[%d] = %d\n", i, numbers[i]);  }  // 部分初始化和自动初始化为0  int partialInit[5] = {1, 2}; // 只初始化了前两个元素,其余自动初始化为0  printf("Partially initialized array:\n");  for(int i = 0; i < 5; i++) {  printf("partialInit[%d] = %d\n", i, partialInit[i]);  }  // 使用变量大小,变长数组(VLA) int size = 3;  int vla[size]; // 变长数组  for(int i = 0; i < size; i++) {  vla[i] = i * 2; // 初始化  }  printf("Variable Length Array:\n");  for(int i = 0; i < size; i++) {  printf("vla[%d] = %d\n", i, vla[i]);  }   return 0;  
}

运行结果如下:

 

测试代码2:

#include <stdio.h>  
// 冒泡排序  
void bubbleSort(int arr[], int n) {  int i, j, temp;  for (i = 0; i < n-1; i++) {  for (j = 0; j < n-i-1; j++) {  if (arr[j] > arr[j+1]) {  temp = arr[j];  arr[j] = arr[j+1];  arr[j+1] = temp;  }  }  }  
}  // 选择排序  
void selectionSort(int arr[], int n) {  int i, j, minIndex, temp;  for (i = 0; i < n-1; i++) {  minIndex = i;  for (j = i+1; j < n; j++) {  if (arr[j] < arr[minIndex]) {  minIndex = j;  }  }  temp = arr[minIndex];  arr[minIndex] = arr[i];  arr[i] = temp;  }  
}  int main() {  //户输入整数以及整数个数 int n, choice, i;  printf("请输入整数的个数: ");  scanf("%d", &n);  int arr[n];  printf("请输入%d个整数:\n", n);  for(i = 0; i < n; i++) {  scanf("%d", &arr[i]);  }  printf("选择排序算法(1: 冒泡排序, 2: 选择排序): ");  scanf("%d", &choice);  //选择排序方式 switch(choice) {  case 1:  bubbleSort(arr, n);  printf("冒泡排序后的数组:\n");  break;  case 2:  selectionSort(arr, n);  printf("选择排序后的数组:\n");  break;  default:  printf("无效的选择,请重新运行程序。\n");  return 1;  }  //打印排序后的数组 for (i = 0; i < n; i++)  printf("%d ", arr[i]);  printf("\n");  return 0;  
}

运行结果如下:

 

测试代码3:

#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  // 函数声明  
void generateRandomNumbers(int arr[], int n);  
void sortDescending(int arr[], int n);  
void insertNumber(int arr[], int *n, int number);  
void deleteNumber(int arr[], int *n, int m);  
void printArray(int arr[], int n);  int main() {  int n, number, m;  int *arr;  // 初始化随机数生成器  srand(time(NULL));  printf("Enter the number of two-digit integers: ");  scanf("%d", &n);  // 动态分配数组  arr = (int *)malloc(n * sizeof(int));  if (arr == NULL) {  printf("Memory allocation failed!\n");  return 1;  }  // 生成随机数  generateRandomNumbers(arr, n);  printf("Original array:\n");  printArray(arr, n);  // 排序  sortDescending(arr, n);  printf("Sorted array (descending):\n");  printArray(arr, n);  // 插入数字  printf("Enter a number to insert: ");  scanf("%d", &number);  insertNumber(arr, &n, number);  printf("Array after insertion:\n");  printArray(arr, n);  // 删除数字  printf("Enter the index (0-%d) to delete: ", n - 1);  scanf("%d", &m);  if (m >= 0 && m < n) {  deleteNumber(arr, &n, m);  printf("Array after deletion:\n");  printArray(arr, n);  } else {  printf("Invalid index!\n");  }  // 释放内存  free(arr);  return 0;  
}  // 实现函数  
void generateRandomNumbers(int arr[], int n) {  for (int i = 0; i < n; i++) {  arr[i] = rand() % 90 + 10; // 生成10到99之间的随机数  }  
}  //冒泡排序,按降序排列数组 
void sortDescending(int arr[], int n) {  for (int i = 0; i < n - 1; i++) {  for (int j = 0; j < n - i - 1; j++) {  if (arr[j] < arr[j + 1]) {  int temp = arr[j];  arr[j] = arr[j + 1];  arr[j + 1] = temp;  }  }  }  
}  
//在数组中插入一个数,并保持数组的有序性。  
void insertNumber(int arr[], int *n, int number) {  int i;  for (i = *n - 1; (i >= 0 && arr[i] < number); i--) {  arr[i + 1] = arr[i];  }  arr[i + 1] = number;  (*n)++;  
}  
//根据索引删除数组中的一个元素,并调整数组大小。 
void deleteNumber(int arr[], int *n, int m) {  for (int i = m; i < *n - 1; i++) {  arr[i] = arr[i + 1];  }  (*n)--;  
}  
// 打印数组 
void printArray(int arr[], int n) {  for (int i = 0; i < n; i++) {  printf("%d ", arr[i]);  }  printf("\n");  
}

运行结果如下:

 

测试代码4:

#include <stdio.h>  
//一维数组转换为二维数组
//"转换"只是逻辑上的,物理上仍然是一个一维数组。
//确保不要超出数组的实际边界,即index必须在0到total-1之间。
//这种方法在需要动态确定数组大小或数组大小较大时特别有用,
//可以避免使用二维数组可能带来的内存分配问题。 
int main() {  int i, j;  int rows = 3; // 3行  int cols = 4; // 4列  int total = rows * cols; // 总元素数量  // 初始化一维数组  int array[total];  for (i = 0; i < total; i++) {  array[i] = i + 1; //将数组元素初始化为1到total的整数  printf("%d ", array[i]);   }  printf("\n");// 使用二维数组的索引方式访问一维数组  // 通过计算索引(index = i * cols + j)访问一个二维数组。// i代表行索引,j代表列索引,cols是每行的列数。for (i = 0; i < rows; i++) {  for (j = 0; j < cols; j++) {  // 计算一维数组中的索引  int index = i * cols + j;  printf("%d ", array[index]);  }  printf("\n"); // 每完成一行的打印后换行  }  return 0;  
}

运行结果如下:

 

测试代码5:

#include <stdio.h>  
int main() {  // 定义一个5x3的二维数组  int twoDArray[5][3] = {  {1, 2, 3},  {4, 5, 6},  {7, 8, 9},  {10, 11, 12},  {13, 14, 15}  };  // 定义一个足够大的一维数组以存储二维数组的元素  int oneDArray[5 * 3]; // 因为是5x3的二维数组,所以一维数组需要15个元素的空间  // 遍历二维数组,并将元素复制到一维数组中  int index = 0; // 用于一维数组的索引  for (int i = 0; i < 5; i++) { // 遍历二维数组的行  for (int j = 0; j < 3; j++) { // 遍历二维数组的列  oneDArray[index++] = twoDArray[i][j]; // 将二维数组的元素复制到一维数组中,并更新索引  }  }   // 打印一维数组的元素for (int i = 0; i < 5 * 3; i++) {  printf("%d ", oneDArray[i]);  }   return 0;  
}

运行结果如下:

 

 

 

 

 


 

相关文章:

C语言基础(六)

一维数组&#xff1a; C语言中的数组是一种基本的数据结构&#xff0c;用于在计算机内存中连续存储相同类型的数据。 数组中的每个元素可以通过索引&#xff08;或下标&#xff09;来访问&#xff0c;索引通常是从0开始的。 数组的大小在声明时确定&#xff0c;并且之后不能改…...

什么是词向量?如何得到词向量?Embedding 快速解读

我第一次接触 Embedding 是在 Word2Vec 时期&#xff0c;那时候还没有 Transformer 和 BERT 。Embedding 给我的印象是&#xff0c;可以将词映射成一个数值向量&#xff0c;而且语义相近的词&#xff0c;在向量空间上具有相似的位置。 有了 Embedding &#xff0c;就可以对词进…...

AI视频创作应用

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...

JAVA常见的工具类之Object类(超详细)

1、Java API简介 Java API(Java Application Programming Interface)是Java应用程序编程接口的缩写。Java中的API&#xff0c;就是JDK提供的具有各种功能的Java类&#xff0c;灵活使用Java API能够大大提高使用Java语言编写程序的效率。 Java API的帮助文档可到 http://docs.or…...

深度学习(YOLO、DETR) 十折交叉验证

二&#xff1a;交叉验证 在 K 折验证之前最常用的验证方法就是交叉验证&#xff0c;即把数据划分为训练集、验证集和测试集。一般的划分比例为 7&#xff1a;1&#xff1a;2。但如何合理的抽取样本就成为了使用交叉验证的难点&#xff0c;不同的抽取方法会导致截然不同的训练性…...

基于php网上差旅费报销系统设计与实现

网上报销系统以LAMP(LinuxApacheMySQLPHP)作为平台,涉及到PHP语言、MySQL数据库、JavaScript语言、HTML语言。 2.1 PHP语言简介 PHP&#xff0c;一个嵌套的缩写名称&#xff0c;是英文 “超级文本预处理语言”&#xff08;PHP: Hypertext Preprocessor&#xff09;的缩写。P…...

微服务及安全

一、微服务的原理 1.什么是微服务架构 微服务架构区别于传统的单体软件架构,是一种为了适应当前互联网后台服务的「三高需求:高并发、高性能、高可用」而产生的的软件架构。 单体式应用程序 与微服务相对的另一个概念是传统的单体式应用程序( Monolithic application ),…...

图文详解ThreadLocal:原理、结构与内存泄漏解析

目录 一.什么是ThreadLocal 二.ThreadLocal的内部结构 三.ThreadLocal带来的内存泄露问题 ▐ key强引用 ▐ key弱引用 总结 一.什么是ThreadLocal 在Java中&#xff0c;ThreadLocal 类提供了一种方式&#xff0c;使得每个线程可以独立地持有自己的变量副本&#xff0c;而…...

基于java的综合小区管理系统论文.doc

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统综合小区管理系统信息管理难度大&#xff0c;容错率低&am…...

如何合理设置PostgreSQL的`max_connections`参数

合理设置PostgreSQL的max_connections参数对于数据库的稳定性和性能至关重要。这个设置值决定了允许同时连接到数据库的最大客户端数量。如果设置不当&#xff0c;可能导致资源浪费或系统过载。以下是设置max_connections时需要考虑的几个关键因素&#xff1a; 1. 评估系统硬件…...

Kubectl 常用命令汇总大全

kubectl 是 Kubernetes 自带的客户端&#xff0c;可以用它来直接操作 Kubernetes 集群。 从用户角度来说&#xff0c;kubectl 就是控制 Kubernetes 的驾驶舱&#xff0c;它允许你执行所有可能的 Kubernetes 操作&#xff1b;从技术角度来看&#xff0c;kubectl 就是 Kubernetes…...

【Linux】Linux环境基础开发工具使用之Linux调试器-gdb使用

目录 一、程序发布模式1.1 debug模式1.2 release模式 二、默认发布模式三、gdb的使用结尾 一、程序发布模式 程序的发布方式有两种&#xff0c;debug模式和release模式 1.1 debug模式 目的&#xff1a;主要用于开发和测试阶段&#xff0c;目的是让开发者能够更容易地调试和跟…...

clickhouse_driver

一、简介 clickhouse_driver是一个Python库&#xff0c;用于与ClickHouse数据库进行交互。ClickHouse是一个高性能的列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;它适用于实时分析&#xff08;OLAP&#xff09;场景。clickhouse_driver模块提供了与ClickHouse…...

BI分析实操案例分享:零售企业如何利用BI工具对销售数据进行分析?

在当下这个竞争激烈的零售市场&#xff0c;企业如何在波诡云谲的商场中站稳脚跟&#xff0c;实现销售目标的翻倍增长&#xff1f; 答案可能就藏在那些看似杂乱无章的数字里。 是的&#xff0c;你没有看错&#xff0c;答案正是那些我们日常接触的销售数据。它们就像是宝藏&…...

python : Requests请求库入门使用指南 + 简单爬取豆瓣影评

Requests 是一个用于发送 HTTP 请求的简单易用的 Python 库。它能够处理多种 HTTP 请求方法&#xff0c;如 GET、POST、PUT、DELETE 等&#xff0c;并简化了 HTTP 请求流程。对于想要进行网络爬虫或 API 调用的开发者来说&#xff0c;Requests 是一个非常有用的工具。在今天的博…...

宋红康JVM调优思维导图

文章目录 1. 概述2. JVM监控及诊断命令-命令行篇3. JVM监控及诊断工具-GUI篇4. JVM运行时参数5. 分析GC日志 课程地址 1. 概述 2. JVM监控及诊断命令-命令行篇 3. JVM监控及诊断工具-GUI篇 4. JVM运行时参数 5. 分析GC日志...

linux 网卡配置

linux网卡可以通过命令和配置文件配置,如果是桌面环境还可以通过图形化界面配置. 1.ifconfig(interfaces config)命令方式 通常需要以root身份登录或使用sudo以便在Linux机器上使用ifconfig工具。依赖于ifconfig命令中使用一些选项属性&#xff0c;ifconfig工具不仅可以被用来…...

IEEE |第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)

第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)定于2024年10月18-20日在中国杭州隆重举行。本届会议将主要关注机器学习和计算机应用面临的新的挑战问题和研究方向&#xff0c;着力反映国际机器学习和计算机应用相关技术研究的最新进展。 IEEE |第五届机器学习与计算机应…...

【网络安全】漏洞挖掘:IDOR实例

未经许可&#xff0c;不得转载。 文章目录 正文 正文 某提交系统&#xff0c;可以选择打印或下载passport。 点击Documents > Download后&#xff0c;应用程序将执行 HTTP GET 请求&#xff1a; /production/api/v1/attachment?id4550381&enamemId123888id为文件id&am…...

vue项目执行 cnpm install 报错证书过期的解决方案

拉下源码后执行依赖安装过程&#xff0c;报错 error Error: Certificate has expired&#xff0c;可以通过一下方发解决&#xff1a;npm config set strict-ssl false 再执行 cnpm 命令即可正常拉依赖...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...