嵌入式学习Day12---C语言提升
目录
一、指针数组
1.1.什么是指针数组
2.2. 格式
2.3.存储
2.4.与字符型二维数组相比
2.5.什么时候使用指针数组
2.6.练习
二、数组指针
2.1.什么是数组指针
2.2.格式
2.3.一维数组
2.3.特点
2.4.什么时候使用
三、指针和数组的关系
3.1.一维数组和指针
3.2. 二维数组和指针
四、二级指针
4.1.含义
4.2.实际的二级指针
4.3.什么时候使用
五、总结
一、指针数组
1.1.什么是指针数组
指针数组是数组 ,而数组中的每个元素是指针
2.2. 格式
int *arry[5];
2.3.存储
由于指针数组的类型为指针(int *),因此指针数组的每个元素占 8个字节。
int *a[5];故此该指针数组占右8*5=40字节的空间。
2.4.与字符型二维数组相比
字符型二维数组用来存储字符串数组;
指针数组用来操作字符串数组;
2.5.什么时候使用指针数组
操作字符串数组时
2.6.练习
一起来加深一下指针数组的印象
1.定义一个指针数组,并初始化为12个月英文字符串首地址,从终端输入1 - 12对应的数字,
打印出其对应的英文形式。
#include <stdio.h>int main(void)
{char *p[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};int n = 0;scanf("%d", &n);printf("%s\n", p[n-1]);return 0;
}
2.再次练习终端接受字符串,使用指针数组对字符串数组的元素进行冒泡排序并打印结果,并使用数组的方法打印字符串。
#include <stdio.h>
#include <string.h>int main(void)
{char str[5][32] = {0};char *p[5] = {str[0], str[1], str[2], str[3], str[4]};char *q = NULL;int i = 0;int j = 0;for(i = 0; i < 5; i++){gets(str[i]);}for(j = 0; j < 4; j++){for(i = 0; i < 4 -j; i++){if(strcmp(p[i], p[i+1]) > 0){q = p[i];p[i] = p[i+1];p[i+1] = q;}}}printf("-----------------------------------\n");for(i = 0; i < 5; i++){printf("%s\n", p[i]);}printf("-----------------------------------\n");for(i = 0; i < 5; i++){printf("%s\n", str[i]);}return 0;
}
你会发现操作字符串时使用指针数组很方便,在使用冒泡排序时,原数组方法它要交换字符串来实现,而当字符串过大过多时效率很底;而指针数组在活得元素组字符串的地址后,交换时只需要交换地址就行效率很高。
二、数组指针
2.1.什么是数组指针
数组指针是指针,指针指向一个数组(二级指针)
2.2.格式
int (*p)[5] = NULL;
2.3.一维数组
一维数组的数组名是指向第一个元素的指针常量
int a[5] = {1,2,3,4,5};a == &a[0]
一般情况,可以把数组名a理解为int *,但是存在两种特殊的情况不可以这么理解:
·sizeof运算时
sizeof(a) = 20
sizeof(int *) = 8
·&运算时
&a == int(*) [5](对一维数组取&会升级为数组指针)
&int * == int **
2.3.特点
1.对一维数组&得到数组指针
2.数组指针取*操作,类型不变,值降为指向数组第一个元素的指针
3.数组指针的变化量为整个数组大小
2.4.什么时候使用
二维数组传参数时,传数组指针和长度
int fun(int (*parry)[3],int len);int a[2][3] = {0};fun(a, 2);
三、指针和数组的关系
3.1.一维数组和指针
int a[5] = {1,2,3,4,5};int *p = NULL;p = a; / p = &a[0];
访问第n个元素的方式:
a[n] == *(a+n) == *(p+n) == p[n]
3.2. 二维数组和指针
int a[2][3] = {1,2,3,4,5,6};int *p = NULL;int (*p)[3] = NULL;p = &a[0][0];p = a[0];q = a;
由于a[0]是由上图中的a[0][0]、a[0][1]、a[0][2]三个元素组成的一维数组,又有一维数组的数组名式是指向第一个元素的指针,故此p = a[0];
由于a[0][0]是a[0]数组的第一个元素,故此p = &a[0][0];
又由于a是由a[0]和a[1]两个一维数组组成的一维数组,又有一维数组的数组名式是指向第一个元素的指针,故此:q = a;
现在要访问第m行n列的元素,可以怎样访问:
a[m][n]*(a[m]+n)*(*(a+m)+n)*(p+m*N+n)*(q[m]+n)*(*(q+m)+n)q[m][n]
四、二级指针
4.1.含义
指向指针变量的指针
4.2.实际的二级指针
1.函数体内想修改函数体外指针变量值的时候,传指针变量的地址即二级指针
2.指针数组的数组名是指向数组第一个元素的指针,即指向指针的指针也就是二级指针
4.3.什么时候使用
1.函数体内想修改外部指针变量值传入二级指针
#include <stdio.h>int fun(char **pptmp)
{*pptmp = "hello world";return 0;
}int main(void)
{char *p = NULL;fun(&p);printf("p = %s\n", p);return 0;
}
结果为:p = hello world
2.指针数组的数组名是二级指针
五、总结
2024年7月24日,已经学习了12天啦!C语言的学习也接近尾声了。今天主要学习了指针数组、数组指针、二级指针,时指针中算是难的部分也是C语言中算是的难的部分了。努努力,争取今天消化了。
加油!
相关文章:

嵌入式学习Day12---C语言提升
目录 一、指针数组 1.1.什么是指针数组 2.2. 格式 2.3.存储 2.4.与字符型二维数组相比 2.5.什么时候使用指针数组 2.6.练习 二、数组指针 2.1.什么是数组指针 2.2.格式 2.3.一维数组 2.3.特点 2.4.什么时候使用 三、指针和数组的关系 3.1.一维数组和指针 …...

6.6 使用dashboard商城搜索导入模板
本节重点介绍 : 模板商城中搜索模板导入模板修改模板 大盘模板商城地址 免费的 地址 https://grafana.com/grafana/dashboards 搜索模板技巧 详情 导入dashboard 两种导入模式 url导入id导入json文件导入 导入 node_exporter模板 https://grafana.com/grafana/dashboa…...
一文讲透useMemo和useCallback
在React项目中是经常会使用到useMemo,useCallBack的,这是两个优化性能的方法,那么useMemo,useCallBack到底是什么呢?什么时候用呢? 下面将给打击分享相关知识,希望对大家有所帮助同时欢迎讨论指…...
【环境变量】安装了一个软件,如何配置环境变量?
配置环境变量为啥? 方便地在任何文件夹下调用某一指定目录下的文件。 配置步骤 以jdk17为例。 1.打开环境变量配置页面 2.新建一个变量,变量名为JAVA_HOME,内容为jdk的path路径 3.打开path变量,新建一个%JAVA_HOME%\bin&#x…...

重生之我当程序猿外包
第一章 个人介绍与收入历程 我出生于1999年,在大四下学期进入了一家互联网公司实习。当时的实习工资是3500元,公司还提供住宿。作为一名实习生,这个工资足够支付生活开销,每个月还能给父母转1000元,自己留2500元用来吃…...
我想给 git 分支换一个名字,应该怎么做?
Git中重命名分支的操作步骤如下: 确保你在要重命名的分支上。可以使用git branch或git status命令查看当前所在分支[1][2]. 使用以下命令重命名当前分支: git branch -m new-branch-name例如,将当前分支重命名为"feature-xyz": git branch -m feature-xyz-m参数是&q…...
echarts多stack的legend点选
echarts支持点击legend,实现显示和隐藏legend对应的数据,具体就是option里series里,name为legend值的数据。 如果配置了多个stack,那么可能你可能设置了多组legend,你点选的是多个legend组中的某组中的一个,那么如果不…...

搭建自己的金融数据源和量化分析平台(四):自动化更新上市公司所属一级、二级行业以及股票上市状态
前面做了更新沪深交易所的上市股票列表的读取和更新,但一旦股票退市则需要在数据库里将该股票状态更新为退市,同时附上退市日期,将股票名更改为XX退。 此外深交所下载的xls解析出来是没有上市公司所属的二级行业的,因此还需要建立…...

科创板重启IPO上会!募投审核新方向?思看科技等优化募投项目
撰稿 | 多客 来源 | 贝多财经 根据上交所项目审核动态最新公告,思看科技(杭州)股份有限公司(简称“思看科技”)将于8月2日上会,标志着时隔50天后科创板重新迎来首家上会企业,也标志着思看科技…...
深入解析损失函数:从基础概念到YOLOv8的应用
深入解析损失函数:从基础概念到YOLOv8的应用 在机器学习和深度学习中,损失函数是至关重要的组件,它们衡量模型的预测值与真实值之间的差距,从而指导模型的优化过程。本文将详细探讨损失函数的基本概念,及其在YOLOv8中…...

2.11.ResNet
ResNet 动机:我们总是想加更多层,但加更多层并不总是能改进精度 可以看出F1到F6模型越来越大,但F6距离最优解却总变远了,反而效果不好,通俗的来说就是学偏了,实际上我们希望是这样的: 更大…...

GitLab添加TortoiseGIT生成SSH Key
文章目录 前言一、PuTTYgen二、GitLab 前言 GitLab是一个用于托管代码仓库和项目管理的Web平台,公司搭建自己的gitlab来管理代码,我们在clone代码的时候可以选择http协议,也可以选择ssh协议来拉取代码。 SSH (Secure Shell)是一种通过网络进…...
20240729 大模型评测
参考: MMBench:基于ChatGPT的全方位多模能力评测体系_哔哩哔哩_bilibili https://en.wikipedia.org/wiki/Levenshtein_distance cider: https://zhuanlan.zhihu.com/p/698643372 GitHub - open-compass/opencompass: OpenCompass is an LLM evalua…...

基于微信小程序的校园警务系统/校园安全管理系统/校园出入管理系统
摘要 伴随着社会以及科学技术的发展,小程序已经渗透在人们的身边,小程序慢慢的变成了人们的生活必不可少的一部分,紧接着网络飞速的发展,小程序这一名词已不陌生,越来越多的学校机构等都会定制一款属于自己个性化的小程…...

达梦数据库归档介绍
一、什么是归档 数据库归档是一种数据管理策略,它涉及将旧的、不经常访问的数据移动到一个单独的存储设备,以便在需要时可以检索,同时保持数据库的性能和效率。 归档的主要目标是为了释放数据库中的空间,以便更有效地利用高性能…...
OpenAI推出AI搜索引擎SearchGPT
OpenAI推出AI搜索引擎SearchGPT 据英国《卫报》和美国消费者新闻与商业频道等媒体报道,7月25日,OpenAI宣布正在测试一款名为SearchGPT的全新人工智能(AI)搜索工具。该工具能够实时访问互联网信息,旨在为用户提供更具时…...
elementplus菜单组件的那些事
在使用 elementplus 的菜单组件时,我发现有很多东西是官方没有提到但是需要注意的点 1. 菜单组件右侧会有一个边框 设置css .el-menu {border: 0 !important; } 2. 使用其他的 icon 文字内容一定要写在 这个 名字为 title 的插槽中 <el-menu-itemv-for"it…...

【VSCode实战】Golang无法跳转问题竟是如此简单
上一讲【VSCode实战】Go插件依赖无法安装 – 经云的清净小站 (skycreator.top),开头说到了在VSCode中Golang无法跳转的问题,但文章的最后也没给出解决方案,只解决了安装Go插件的依赖问题。 解决了插件依赖问题,无法跳转的问题也离…...
three.js中加载ply格式的文件,并使用tween.js插件按照json姿态文件运动
先贴一下文件地址: aa.ply 文件: https://download.csdn.net/download/yinge0508/89595650?spm1001.2014.3001.5501 new.json https://download.csdn.net/download/yinge0508/89595641?spm1001.2014.3001.5501 代码: <template><div>&…...
性能对比:Memcached 与 Redis 的关键差异
性能对比:Memcached 与 Redis 的关键差异 在选择合适的缓存系统时,Memcached 和 Redis 是最常被提及的两种技术。它们都是内存存储系统,用于提高数据访问速度和应用性能。尽管它们在功能上有很多相似之处,但在性能、特性和应用场…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
AWS vs 阿里云:功能、服务与性能对比指南
在云计算领域,Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商,各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5],我将从功能、服务和性能三个方面进行结构化对比分析&#…...

react更新页面数据,操作页面,双向数据绑定
// 路由不是组件的直接跳转use client,useEffect,useRouter,需3个结合, use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...