从零开始学习嵌入式----C语言数组指针

目录

拨开迷雾:深入浅出C语言数组指针

一、 数组与指针:剪不断理还乱的关系

二、 数组指针:指向数组的指针

三、 数组指针的应用场景

四、 总结


拨开迷雾:深入浅出C语言数组指针

       数组和指针,在C语言的世界里,就如同武侠小说中的少林和武当,是两大基础却又博大精深的主题。而数组指针,则是这两大派别招式融合的精妙体现,理解它,对于掌握C语言的精髓至关重要。

一、 数组与指针:剪不断理还乱的关系

在揭开数组指针的神秘面纱之前,我们先来回顾一下数组和指针本身。

       数组,顾名思义,就是相同数据类型元素的集合。比如 int arr[5] = {1, 2, 3, 4, 5}; 就定义了一个包含5个整型元素的数组 arr

       指针,则是指向内存特定位置的变量。例如 int *ptr = &arr[0]; 就定义了一个指向整型变量的指针 ptr,并将 arr 数组第一个元素的地址赋给了它。

那么数组和指针之间有什么关系呢?

关键点:数组名在多数情况下会退化为指向其首元素的指针。

也就是说,arr&arr[0] 在很多情况下是等价的,它们都代表了数组第一个元素的内存地址。

二、 数组指针:指向数组的指针

铺垫了这么多,终于要请出今天的主角——数组指针了。

顾名思义,数组指针就是一个指向数组的指针。它的定义形式如下:

数据类型 (*指针名)[数组长度];

例如:

int (*p)[5]; 

这里 p 就是一个数组指针,它指向一个包含5个整型元素的数组。

需要注意的是,(*指针名)两边的括号必不可少。 因为 [] 的优先级高于 *,如果没有括号,int *p[5]; 就变成了定义一个包含5个指向整型变量的指针数组,而不是我们想要的数组指针了。

三、 数组指针的应用场景

理解了数组指针的定义,我们再来看看它有哪些应用场景。

  1. 操作二维数组

二维数组可以看作是由多个一维数组组成的,而数组指针可以方便地指向一个一维数组。因此,我们可以利用数组指针来遍历二维数组,例如:

int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int (*p)[4] = arr; // p 指向二维数组的第一行
for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {printf(「%d 」, p[i][j]); // 通过数组指针访问二维数组元素}printf(「
」);
}

  1. 函数参数传递

当我们需要将一个数组作为参数传递给函数时,也可以使用数组指针。例如:

void print_array(int (*arr)[5], int len) {for (int i = 0; i < len; i++) {printf(「%d 」, (*arr)[i]); }printf(「
」);
}#  #
int main() {int arr[5] = {1, 2, 3, 4, 5};print_array(&arr, 5); return 0;
}

这里 print_array 函数的参数就是一个数组指针,它接收指向包含5个整型元素的数组的指针。

四、 总结

       数组指针是C语言中一个比较难以理解的概念,但只要掌握了它的定义和常见应用场景,就能在实际编程中游刃有余地使用它。希望这篇文章能够帮助你拨开数组指针的迷雾,更好地理解和运用C语言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/46473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转springboot之SpringApplicationRunListener

SpringApplicationRunListener 在看源码的时候经常看到 SpringApplicationRunListeners listeners getRunListeners(args); listeners.starting();这个SpringApplicationRunListeners是用来干嘛的呢 public interface SpringApplicationRunListener {/*** run方法首次启动的…

pico+unity手柄和摄像机控制初级设置

1、摄像头配置 摄像头模式、floor是追踪原点类型&#xff08;将根据设备检测到地面的高度来计算追踪原点&#xff09;&#xff0c; Device 模式时&#xff0c;为通常理解的 Eye 模式&#xff0c;不会将根据设备检测到地面的高度来计算追踪原点 选择floor时&#xff0c;修改相…

K8S ingress 初体验 - ingress-ngnix 的安装与使用

准备环境 先把 google 的vm 跑起来… gatemanMoreFine-S500:~/projects/coding/k8s-s/service-case/cloud-user$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 124d v1.23.6 k8s-no…

Redis实践

Redis实践 使用复杂度高的命令 如果在使用Redis时&#xff0c;发现访问延迟突然增大&#xff0c;如何进行排查&#xff1f; 首先&#xff0c;第一步&#xff0c;建议你去查看一下Redis的慢日志。Redis提供了慢日志命令的统计功能&#xff0c;我们通过以下设置&#xff0c;就…

王牌站士Ⅶ--理解大型语言模型LLM的参数

模型的大小并不一定决定其成功 在学习任何大型语言模型 (LLM) 时&#xff0c;您首先会听到的事情之一就是给定模型有多少个参数。如果您查看下面的图表&#xff0c;您会注意到参数大小范围很广 - 一个模型可能有 10 亿或 20 亿个参数&#xff0c;也可能有超过 1.75 万亿个参数。…

c++学习30自平衡树

#pragma once // 定义AVL树节点结构 template<class K, class V> struct AVLTreeNode {// 节点默认构造函数AVLTreeNode(): _left(nullptr), _right(nullptr), _parent(nullptr), _by(0){}AVLTreeNode<K, V>* _left; // 左子节点指针AVLTreeNode<K, V>…

Java —— abstract关键字

abstract关键字 1.抽象类与抽象方法 随着继承层次中一个个新子类的定义&#xff0c;类变得越来越具体&#xff0c;而父类则更一般&#xff0c;更通用。有时将一个父类设计得非常抽象&#xff0c;以至于它没有具体的实例&#xff0c;只提供该顶层类的功能&#xff08;只有顶层…

了解redis

1.什么是redis&#xff1f; redis是一款高性能的NOSQL系列的非关系型数据库 想了解非关系型数据库概念前往上期(NoSQL Not Only SQL)&#xff0c;意即“不仅仅是SQL”-CSDN博客 Redis是用C语言开发的一个开源的高性能键值对&#xff08;key-value&#xff09;数据库&#x…

老年生活照护实训室:让养老护理更个性化

本文探讨了老年生活照护实训室在实现养老护理个性化方面的重要作用。通过分析其提供的实践环境、专业培训、模拟案例和评估机制&#xff0c;阐述了如何培养护理人员的个性化服务能力&#xff0c;以满足老年人多样化的需求&#xff0c;提高养老护理的质量和满意度。 在老龄化社会…

CentOS7.X系统部署Zabbix6.0版本(可跟做)

文章目录 一、部署环境说明二、基本环境部署步骤1、环境初始化操作2、部署并配置Nginx3、部署并配置PHP4、测试NginxPHP环境5、部署并配置MariaDB 三、Zabbix-Server部署步骤1、编译安装Zabbix-Server2、导入Zabbix初始化库3、配置Zabbix前端UI4、启动Zabbix-Server5、WEB页面配…

java代码:单链表的实现

1、代码 package LinkList;public class Linklist {//定义节点&#xff0c;内部类只为其外部类使用//要创建嵌套类的对象&#xff0c;并不需要其外围类的对象&#xff0c;直接使用.nextstatic class ListNode{int val;//数据域ListNode next;//指针&#xff0c;指向下一个结点…

前端面试题日常练-day90 【Less】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 在Less中&#xff0c;以下哪种语法适用于定义变量&#xff1f; a) $var b) variable c) #variable d) &variable Less中的Mixin是用来做什么的&#xff1f; a) 定义变量 b) 创建循环 c) 处理函数…

数据建设实践之大数据平台(二)安装zookeeper

安装zookeeper 上传安装包到/opt/software目录并解压 [bigdatanode101 software]$ tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/services/ 重命名文件 [bigdatanode101 services]$ mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7 配置环境变量 export JAVA_H…

GPT-4从0到1搭建一个Agent简介

GPT-4从0到1搭建一个Agent简介 1. 引言 在人工智能领域&#xff0c;Agent是一种能够感知环境并采取行动以实现特定目标的系统。本文将简单介绍如何基于GPT-4搭建一个Agent。 2. Agent的基本原理 Agent的核心是感知-行动循环&#xff08;Perception-Action Loop&#xff09;…

C#与倍福Plc通信——使用仿真软件模拟倍福PLC运行

前言 我们在编写上位机与倍福PLC通信的过程中,有时候我们没有真实的Plc,但是我们又想提前测试与倍福PLC的通信,那么这个时候我们就可以使用倍福的仿真软件模拟PLC,然后我们上位机就可以与仿真PLC进行通信了,下面进行详细介绍: 1、下载并安装倍福PLC编程软件TwinCAT 安…

Elasticsearch集群健康检查与监控

在大数据时代&#xff0c;Elasticsearch作为一款高性能、可扩展的搜索与分析引擎&#xff0c;广泛应用于各种需要快速数据检索和分析的场景中。然而&#xff0c;随着数据量的不断增加和集群规模的扩大&#xff0c;保持Elasticsearch集群的健康状态和高效运行变得尤为重要。本文…

python 如何处理图片 举例说明

Python有很多库可以用于处理图片&#xff0c;常用的有Pillow和OpenCV。 举例说明如下&#xff1a; 使用Pillow库读取图片并显示&#xff1a; from PIL import Image# 打开图片 image Image.open(image.jpg)# 显示图片 image.show()使用Pillow库调整图片大小&#xff1a; f…

关于 LayoutInflater.inflate 的取值结论

根节点是否是 mergeViewGroup rootboolean attachToRoot返回值否notNullfalse返回的是 xml 布局的根节点 View 对象&#xff0c;并且对象上拥有根节点上的布局参数。否notNulltrue返回的是添加了根节点View对象以及布局参数的root对象。否nullfalse返回的是没有布局参数信息的根…

Java中的输入输出

输出到控制台 【基本语法】&#xff1a; System.out.println(msg); // 输出一个字符串, 带换行 System.out.print(msg); // 输出一个字符串, 不带换行 System.out.printf(format, msg); // 格式化输出 println 输出的内容自带 \n, print不带 \n printf 的格式化输出方式和…

面试题: C++11用过哪些特性

面试题&#xff1a; C11用过哪些特性 考察重点&#xff1a; 回答问题的层次学习总结的思路 语法糖 关键字&#xff1a; auto, decltypenullptrfinal, overrideconstexpr 语法&#xff1a; 基于范围的for循环 function函数对象&#xff0c;bind, lambda STL容器 array…