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

C语言复习概要(六)

在这里插入图片描述

公主请阅

    • 1. 深入理解数组与指针在C语言中的应用
      • 1.1 数组名的理解
    • 2. 使用指针访问数组
    • 3. 一维数组传参的本质
    • 4. 冒泡排序的实现
    • 5. 二级指针
    • 6. 指针数组
    • 7. 指针数组模拟二维数组
    • 8.总结

1. 深入理解数组与指针在C语言中的应用

数组与指针是C语言的核心概念之一,理解它们的本质及其相互关系是成为C语言高手的必经之路。数组为我们提供了一种存储大量相同类型数据的高效方式,而指针则为操作这些数据提供了极大的灵活性。本文将从数组名与指针的基本理解出发,深入探讨指针与数组的结合使用,并通过经典的冒泡排序算法和多级指针操作举例说明。

1.1 数组名的理解

数组是存储相同类型数据的线性结构。一个简单的一维数组的声明如下:

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

在这个例子中,arr是一个包含5个int类型元素的数组。但是在更底层的C语言内存模型中,数组名实际上是一个常量指针,它指向数组的第一个元素的地址。也就是说,arr的值是&arr[0]。但需要注意的是,数组名本身是一个常量,不能像普通指针一样被重新赋值。

例如,下面的代码将会报错:

arr = &x; // 错误:数组名是常量,不能被赋值

这一点解释了为什么我们可以通过指针的方式来访问数组的元素:

int *p = arr;

在这个例子中,p指向arr[0],也就是数组的第一个元素。通过指针p,我们可以轻松访问整个数组元素:

for (int i = 0; i < 5; i++) {printf("%d ", *(p + i));  // 输出:1 2 3 4 5
}

这说明数组名其实是一种特殊的指针,它和指针的行为非常相似,但在某些情况下,数组名与普通指针的行为略有不同。

2. 使用指针访问数组

使用指针访问数组是C语言中非常常见的操作,它可以提高程序的效率。我们可以通过指针遍历数组,而不是通过索引。

假设有一个数组:

int arr[5] = {10, 20, 30, 40, 50};

你可以通过指针访问数组的每一个元素:

int *ptr = arr;for (int i = 0; i < 5; i++) {printf("Element %d: %d\n", i, *(ptr + i));
}

这里,ptr + i表示指向数组中第i个元素的指针,而*(ptr + i)则解引用该指针,得到对应的值。通过指针直接访问数组元素,避免了使用数组下标的额外计算,从而提升了访问速度。

3. 一维数组传参的本质

在C语言中,函数传递数组参数实际上是传递指针。让我们来看看一个示例:

void printArray(int *arr, int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}
}

在这里,arr实际上是一个指向数组的指针,而不是整个数组。当我们调用这个函数时,传递的实际上是数组的地址:

int arr[5] = {1, 2, 3, 4, 5};
printArray(arr, 5);

这种方式使得数组传参非常高效,因为只需传递数组的首地址即可,而不是整个数组的内容。这样可以节省大量的内存和时间,特别是在处理大型数组时。

4. 冒泡排序的实现

冒泡排序是一种经典的排序算法,借助数组和指针的结合,我们可以用更灵活的方式实现它。让我们看看如何用指针来实现冒泡排序:

void bubbleSort(int *arr, int size) {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (*(arr + j) > *(arr + j + 1)) {// 交换两个元素int temp = *(arr + j);*(arr + j) = *(arr + j + 1);*(arr + j + 1) = temp;}}}
}

在这个例子中,我们通过指针访问数组中的元素并进行交换。与直接使用数组下标相比,使用指针能更加灵活地操作内存地址。

5. 二级指针

二级指针(即指向指针的指针)是C语言中的另一个重要概念。它常用于动态分配二维数组或在函数中修改指针的值。假设我们需要通过函数来修改一个指针的指向:

void modifyPointer(int **p) {static int x = 10;*p = &x;
}

在这个例子中,p是一个二级指针,它指向一个指针。通过解引用p,我们可以改变一级指针的值。在函数调用中:

int *ptr = NULL;
modifyPointer(&ptr);
printf("%d\n", *ptr);  // 输出:10

这展示了如何通过二级指针在函数中修改一级指针的值。

6. 指针数组

指针数组是一个存储指针的数组。它通常用于存储一组字符串或指向其他数组的指针。让我们看看一个指针数组的例子:

char *names[] = {"Alice", "Bob", "Charlie", "David"};for (int i = 0; i < 4; i++) {printf("%s\n", names[i]);
}

在这个例子中,names是一个指针数组,每个元素都是一个指向字符串的指针。通过遍历指针数组,我们可以输出每个字符串。

指针数组在处理动态内存分配和多维数组时非常有用。

7. 指针数组模拟二维数组

二维数组是一种常见的数据结构,但有时候我们需要使用指针数组来模拟二维数组,以获得更大的灵活性。例如,以下代码演示了如何使用指针数组来动态创建一个二维数组:

int rows = 3, cols = 4;
int **arr = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++) {arr[i] = (int *)malloc(cols * sizeof(int));
}// 为数组赋值
for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {arr[i][j] = i * cols + j;}
}// 打印数组
for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {printf("%d ", arr[i][j]);}printf("\n");
}// 释放内存
for (int i = 0; i < rows; i++) {free(arr[i]);
}
free(arr);

这里,我们首先分配了一个存储行指针的数组,然后为每一行分配内存。这种方法使得我们可以根据需要动态调整二维数组的大小。

8.总结

数组与指针是C语言中的基础概念,但它们的结合使用可以极大提高程序的灵活性和效率。通过理解数组名的本质、指针访问数组、函数传参中的指针使用、以及指针数组与多级指针的应用,我们可以编写出高效且灵活的C程序。冒泡排序和二维数组的指针模拟为我们展示了指针在实际算法和数据结构中的应用。掌握这些技巧和概念,将帮助你在C语言编程中走得更远。

相关文章:

C语言复习概要(六)

公主请阅 1. 深入理解数组与指针在C语言中的应用1.1 数组名的理解 2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序的实现5. 二级指针6. 指针数组7. 指针数组模拟二维数组8.总结 1. 深入理解数组与指针在C语言中的应用 数组与指针是C语言的核心概念之一&#xff0c;理解…...

PyQt 入门教程(2)搭建开发环境

文章目录 一、搭建开发环境1、安装PyQt5与pyqt5-tools2、配置QtDesigner3、配置Pyuic4、配置Pyrcc 一、搭建开发环境 1、安装PyQt5与pyqt5-tools PyQt5&#xff1a; PyQt的开发库。Pyqt5-tools&#xff1a; 它是一个包含多种工具的工具包&#xff0c;旨在帮助开发者更方便地使…...

Flink Kubernetes Operator

Flink Kubernetes Operator是一个用于在Kubernetes集群上管理Apache Flink应用的工具。 一、基本概念 Flink Kubernetes Operator允许用户通过Kubernetes的原生工具&#xff08;如kubectl&#xff09;来管理Flink应用程序及其生命周期。它简化了Flink应用在Kubernetes集群上的…...

【最新华为OD机试E卷-支持在线评测】字符统计及重排(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…...

springboot使用GDAL获取tif文件的缩略图并转为base64

springboot使用GDAL获取tif文件的缩略图并转为base64 首先需要安装gdal&#xff1a;https://blog.csdn.net/qq_61950936/article/details/142880279?spm1001.2014.3001.5501 然后是配置pom.xml文件&#xff1a; <!--处理缩略图的--><dependency><groupId>o…...

Pytorch——pip下载安装pytorch慢的解决办法

一、找到需要下载的pytorch链接 运行&#xff1a;pip install torch1.11.0cu113 torchvision0.12.0cu113 torchaudio0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113。然后得到&#xff1a; 我这里为&#xff1a;https://download.pytorch.org/whl/cu113/t…...

uniapp微信小程序调用百度OCR

uniapp编写微信小程序调用百度OCR 公司有一个识别行驶证需求&#xff0c;调用百度ocr识别 使用了image-tools这个插件&#xff0c;因为百度ocr接口用图片的base64 这里只是简单演示&#xff0c;accesstoken获取接口还是要放在服务器端&#xff0c;不然就暴露了自己的百度项目k…...

Vue3+TS项目---实用的复杂类型定义总结

namespace 概念 在TypeScript中&#xff0c;namespace是一种用于组织代码得结构&#xff0c;主要用于将相关得功能&#xff08;例如类、接口、函数等&#xff09;组合在一起。它可以帮助避免命名冲突&#xff0c;尤其是在大项目中。 用法 1.定义命名空间 使用namespace关键…...

尚硅谷rabbitmq2024 工作模式路由篇 第11节 答疑

String exchangeName "test_direct"; /! 创建交换机 人图全 channel.exchangeDeclare(exchangeName,BuiltinExchangeType.DIREcT, b: true, b1: false, b2: false, map: null); /1 创建队列 String queue1Name "test_direct_queue1"; String queue2Name &q…...

HTTP vs WebSocket

本文将对比介绍HTTP 和 WebSocket &#xff01; 相关文章&#xff1a; 1.HTTP 详解 2.WebSocket 详解 一、HTTP&#xff1a;请求/响应的主流协议 HTTP&#xff08;超文本传输协议&#xff09;是用于发送和接收网页数据的标准协议。它最早于1991年由Tim Berners-Lee提出来&…...

R语言医学数据分析实践-数据读写

【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言编程_夏天又到了的博客-CSDN博客 R编程环境的搭建-CSDN博客 在分析公共卫生数据时&#xff0c;数…...

JavaWeb环境下Spring Boot在线考试系统的优化策略

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于JavaWeb技术的在线考试系统设计与实现的开发全过程。通过分析基于Java Web技术的在线考试系统设计与实现管理的不足&#xff0c;创建了一个计算机管理基于Ja…...

ETL技术在金蝶云星空与旺店通WMS集成中的应用

金蝶云星空数据集成到旺店通WMS的技术案例分享 在数字化转型的背景下&#xff0c;现代企业对系统间的数据集成需求日益增加。本篇文章将以“组装入库>其他入库单-1”方案为例&#xff0c;详细解析如何通过轻易云数据集成平台&#xff0c;实现金蝶云星空与旺店通WMS之间的数…...

【力扣热题100】3194. 最小元素和最大元素的最小平均值【Java】

题目&#xff1a;3194.最小元素和最大元素的最小平均值 你有一个初始为空的浮点数数组 averages。另给你一个包含 n 个整数的数组 nums&#xff0c;其中 n 为偶数。 你需要重复以下步骤 n / 2 次&#xff1a; 从 nums 中移除 最小 的元素 minElement 和 最大 的元素 maxElement…...

机器学习拟合过程

import numpy as np import matplotlib.pyplot as plt# 步骤1: 生成模拟数据 np.random.seed(0) X 2 * np.random.rand(100, 1) y 4 3 * X 2 * X**2 np.random.randn(100, 1)# 步骤2: 定义线性模型 (我们从随机权重开始) w np.random.randn(2, 1) b np.random.randn(1)#…...

如何快速部署一套智能化openGauss测试环境

一、openGauss介绍 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行&#xff0c;允许用户自由地复制、使用、修改和分发软件。openGauss内核深度融合了华为在数据库领域多年的研发经验&#xff0c;结合企业级场景需求&#xff0c;持续构建竞争力…...

【设计模式】深入理解Python中的原型设计模式

深入理解Python中的原型设计模式 在软件开发中&#xff0c;有时需要创建对象的过程非常复杂或者代价较高&#xff0c;而在同一类对象的实例之间有很多重复的属性。为了避免重复构造对象&#xff0c;提升性能和效率&#xff0c;原型设计模式&#xff08;Prototype Pattern&…...

Django CORS配置方案

参考 https://pypi.org/project/django-cors-headers/ 在setting.py中设置 INSTALLED_APPS [......corsheaders, #添加此行 ]MIDDLEWARE[......corsheaders.middleware.CorsMiddleware, #添加此行django.middleware.common.CommonMiddleware,#django.middleware.csrf.CsrfVi…...

2024年开放式耳机哪个牌子好?推荐最好的顶级开放式耳机品牌

在当下&#xff0c;开放式耳机逐渐成为众多消费者的新宠。与传统入耳式耳机相比&#xff0c;开放式耳机展现出诸多独特之处。它可以呈现出更清晰的音质效果&#xff0c;让用户有更美妙的听觉体验。在佩戴感上&#xff0c;开放式耳机更为舒适&#xff0c;不会给耳朵带来压迫感。…...

零基础读懂Stable Diffusion!

前言 一文搞懂Stable Diffusion是什么&#xff0c;怎么训练和使用&#xff0c;语义信息影响生成图片的过程。>>[][加入极市CV技术交流群&#xff0c;走在计算机视觉的最前沿] 前几个月AIGC可谓是大热了一把&#xff0c;各种高质量的生成图片层出不穷&#xff0c;而其中…...

Hash Join 和 Index Join工作原理和性能差异

在数据库查询中&#xff0c;Hash Join 和 Index Join 是两种常见的表连接策略。了解它们的工作原理和性能差异有助于设计高效的数据库查询。我们可以使用 Java 模拟这两种不同的连接方式&#xff0c;并进行性能对比。 1. Hash Join 和 Index Join 的概念&#xff1a; Hash Joi…...

Apifox简介及使用

Apifox 是一款集 API文档管理、接口调试、接口自动化测试 和 Mock 功能于一体的全功能工具&#xff0c;旨在为开发者和测试人员提供一个高效的一站式解决方案。它融合了 Postman、Swagger、JMeter 等工具的优势&#xff0c;能够极大地提升团队协作和 API 开发的效率。 在实际开…...

十、IPD 实施细节(产品设计与开发管理)

产品设计与开发管理 产品设计与开发管理是IPD(集成产品开发)实施过程中的核心环节。它确保从概念设计到最终产品的实现能够按照预定的质量、成本、进度目标顺利完成,并与市场需求、技术发展及企业战略保持一致。IPD强调产品设计与开发管理过程中跨职能团队的协作、流程的系…...

MySQL-13.DQL-聚合函数

一.DQL-分组查询 二.聚合函数 -- DQL:分组查询 -- 聚合函数 -- 1.统计该企业员工数量 count select count(id) from tb_emp; select count(job) from tb_emp;select count(A) from tb_emp; select count(*) from tb_emp;-- 2.统计该企业最早入职的员工 min select min(entr…...

为什么跟别人学习如何证明定理要远比使用定理更有意义

目录 背景 为什么跟别人学习 什么是高人&#xff0c;如何判断 高人定义 如何判断一个人的能力&#xff1f; 如何考量一个人的成就&#xff1f; 只知道使用定理的局限性 1. 缺乏灵活性和适应性 2. 无法创新或拓展新方法 3. 容易误用或误解定理 4. 难以推理和分析复杂问…...

Qt在Win,Mac和Linux的开机自启设置

Windows Windows 使用注册表来管理开机自启的应用程序。 void runWithSystem(const QString& name, const QString& path, bool autoRun) {QSetting reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", QSetting::NativeForma…...

spring boot热部署

使用热部署解决了每次都需要重新启动的问题&#xff0c;但不过热部署的在对于改动比较小时速度可能快一些&#xff0c;改动大的话尽量停止 1.使用热部署之前需要在pom.xml文件中导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifa…...

网关与蓝牙网关有什么不同之处?

尽管蓝牙网关也属于网关的一种&#xff0c;但在实际应用和功能特性上&#xff0c;它们之间存在着显著的差异。接下来&#xff0c;我们将深入探讨蓝牙网关的独特之处&#xff0c;并与传统网关进行对比分析。 一、网关与蓝牙网关的共同之处 一对多配对能力&#xff1a;无论是网关…...

JAVA计算双十一多产品实付款优惠券的省钱方案

为了计算双十一期间多产品使用优惠券后的实付款省钱方案&#xff0c;我们需要一个更复杂的逻辑来处理优惠券的应用和叠加规则。以下是一个简化的Java示例&#xff0c;用于展示如何计算多种优惠券应用于多个产品后的实付款金额&#xff0c;并找出最省钱的方案。 首先&#xff0…...

零售行业的数字化营销转型之路

一方面&#xff0c;市场竞争激烈&#xff0c;电商平台、新兴品牌和跨界对手带来巨大压力。另一方面&#xff0c;消费者需求变化迅速&#xff0c;更加追求个性化、多元化和便捷化的购物体验&#xff0c;同时传统零售企业还面临着高成本压力&#xff0c;如租金、人力和库存等。 然…...