当前位置: 首页 > 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 命令即可正常拉依赖...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物&#xff0c;因为每个访问一个线程局部变量的线程&#xff08;通过其 get 或 set 方法&#xff09;都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段&#xff0c;这些类希望将…...