【重拾C语言】七、指针(二)指针与数组(用指针标识数组、多维数组与指针、数组指针与指针数组)

目录

前言

七、指针

7.1~3 指针与变量、指针操作、指向指针的指针

7.4 指针与数组

7.4.1 用指针标识数组

7.4.2 应注意的问题

a. 数组名是指针常量

b. 指针变量的当前值

c. 数组超界

7.4.3 多维数组与指针

7.4.4 指针数组

a. 指针数组

b. 数组指针

c. 对比总结


 

前言

在C语言中,指针和数组之间存在着密切的关系,指针可以用来标识和操作数组元素

  • 数组名是数组的首地址,即a[0]的地址(常量);
  • 指针的值也是一个地址(变量
  • 如果一个指针p指向数组a的首地址(即指向a[0]),则p与a表示的是同一个对象。
    • int a[10]; int *p=a; //int *p=&a[0];
      

 

 

七、指针

7.1~3 指针与变量、指针操作、指向指针的指针

【重拾C语言】七、指针(一)指针与变量、指针操作、指向指针的指针-CSDN博客https://blog.csdn.net/m0_63834988/article/details/133690334?spm=1001.2014.3001.5501

7.4 指针与数组

7.4.1 用指针标识数组

        可以使用指针来标识数组元素。通过将数组名转换为指针,可以通过指针来访问数组中的元素。

  •  数组名是指针(常量),指针也是数组
    • int  a[5];
      int  *p
      p=a;     // 也可写成 p=&a[0]
    • 访问数组a的第i个元素,如下操作等价
      • a[i]
        *(a+i)
        *(p+i) 
        p[i]
        

 

7.4.2 应注意的问题

a. 数组名是指针常量

        数组名实际上是指向数组首元素的指针常量,它存储了数组的起始地址。由于数组名是常量,因此不能对其进行赋值操作。

  • 指针变量可以参与运算
  • 虽然数组名也是指针,但对数组名却不能这样,因为数组名是指针常量
  • 对数组变量a的增1运算“a++”是非法的

 

b. 指针变量的当前值

        指针变量的当前值是指针所指向的内存地址。指针变量存储了一个地址值,该地址指向内存中的某个位置。通过解引用指针,可以访问或修改指针所指向地址处存储的值。

 

c. 数组超界

        数组超界指的是访问数组元素时超过了数组的有效索引范围。当我们访问数组时,应该确保索引值在合法范围内,即大于等于0且小于数组长度。如果超出了数组的有效索引范围,将会导致未定义的行为,可能会访问到未知的内存区域,从而引发错误或崩溃。

#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5};int *ptr = arr;  // 数组名作为指针常量// 使用指针算术访问数组元素printf("数组元素:\n");for (int i = 0; i < 5; i++) {printf("arr[%d] = %d\n", i, *(ptr + i));  // 指针变量的当前值}// 超出数组界限printf("\n尝试访问数组边界之外的元素:\n");printf("arr[5] = %d\n", *(ptr + 5));  // 访问第6个元素return 0;
}

 

e087a3daa5314ca4b02e815961963e47.png

 

7.4.3 多维数组与指针

        指针可以用于处理多维数组:多维数组在内存中以连续的方式存储,可以通过指针来依次访问数组中的元素。

以 int 类型二维数组为例:

int arr[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}
};

        可以使用指针来表示这个二维数组。对于二维数组,我们需要使用指向数组的指针,即指向一维数组的指针。可以定义一个指针变量,并让它指向二维数组的首地址:

int (*ptr)[4];  // 指向一维数组的指针
ptr = arr;      // 指向二维数组的首地址

        使用指针来访问二维数组及其元素。通过逐层解引用指针,我们可以访问每个元素:

// 访问二维数组的元素
int element = ptr[1][2];  // 访问第2行第3列的元素,值为7// 或者使用指针算术运算来访问元素
int element = *(*(ptr + 1) + 2);  // 与上面的访问方式等效,值为7
  • ptr[1][2]表示访问第2行第3列的元素
  • *(ptr + 1) + 2表示访问第2行第3列的元素地址
  • *(*(ptr + 1) + 2)表示访问第2行第3列的元素值

 

7.4.4 指针数组

a. 指针数组

        指针数组是指一个数组,其中的每个元素都是指针类型。换句话说,指针数组是一个存储指针的数组。每个指针可以指向不同的对象或变量。

        指针数组的声明形式为type *arrayName[size],其中type是指针指向的数据类型,arrayName是数组的名称,size是数组的大小。

int *ptrArray[5];  // 声明一个包含5个指针的指针数组

 

b. 数组指针

        数组指针是指一个指针,它指向一个数组。换句话说,数组指针是一个指向数组的指针变量。指向的数组的元素类型是固定的。

        数组指针的声明形式为type (*ptrName)[size],其中type是指针指向的数据类型,ptrName是指针变量的名称,size是数组的大小。如上述int (*ptr)[4]:

int (*ptr)[4];  // 声明一个指向包含4个int类型元素的数组的指针

c. 对比总结

  • 指针数组是一个数组,其中的每个元素都是指针类型
  • 数组指针是一个指针,它指向一个数组
  • 指针数组的元素可以指向不同类型的对象或变量,而数组指针指向的数组的元素类型是固定的。
  • 指针数组的大小是数组的大小,而数组指针指向的数组的大小是指针指向的数组的大小。

 

#include <stdio.h>int main() {int arr[3] = {1, 2, 3};int* ptr_arr[3];  // 指针数组,每个元素是一个指向整数的指针int (*ptr)[3];    // 数组指针,指向一个包含3个整数的数组for (int i = 0; i < 3; i++) {ptr_arr[i] = &arr[i];  // 指针数组中的每个元素指向数组arr的对应元素}ptr = &arr;  // 数组指针指向数组arr的起始地址// 通过指针数组访问数组元素for (int i = 0; i < 3; i++) {printf("%p ", ptr_arr[i]);printf("%d\n", *ptr_arr[i]);}printf("\n");// 通过数组指针访问数组元素for (int i = 0; i < 3; i++) {printf("%p ", ptr[i]);      // 指针的地址值printf("%d ", (*ptr)[i]);printf("%p\n", &(*ptr)[i]); // 第i个元素的地址}printf("\n");return 0;
}

 

b8eb28810c694d49a76313cf44f99d65.png

 

 

 

 

 

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

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

相关文章

Reactor网络模式

文章目录 1. 关于Reactor模式的了解2. 基于Reactor模式实现epoll ET服务器2.1 EventItem类的实现2.2 Reactor类的实现Dispatcher函数AddEvent函数DelEvent函数EnableReadWrite函数 2.3 四个回调函数的实现acceptor回调函数recver回调函数sender回调函数errorer回调函数 3. epol…

突破封锁|华为芯片10年进化史:从K3V1到麒麟9000S

华为海思麒麟芯片过去10年研发历程回顾如下&#xff1a; 2009年&#xff1a;华为推出第一款手机芯片K3V1&#xff0c;采用65nm工艺制程&#xff0c;基于ARM11架构&#xff0c;主频600MHz&#xff0c;支持WCDMA/GSM双模网络。这款芯片搭载在华为U8800手机上&#xff0c;标志着华…

在SOLIDWORKS搭建一个简易的履带式机器人

文章目录 前言一、构建模型基本单元二、搭建车体模块三.插入轮子4.构建履带 前言 趁着十一假期&#xff0c;在solidworks中搭建了一个履带式机器人小车&#xff0c;计划将其应用在gazebo中完成多机器人编队的仿真。 一、构建模型基本单元 构建底板&#xff08;a面&#xff09…

面试总结-Redis篇章(十二)——Redis是单线程的,为什么还那么快

Redis是单线程的&#xff0c;为什么还那么快 Redis是单线程的&#xff0c;为什么还那么快什么是IO多路复用 阻塞IO非阻塞IOIO多路复用 Redis是单线程的&#xff0c;为什么还那么快 Redis是纯内存操作&#xff0c;执行速度非常快采用单线程&#xff0c;避免不必要的上下文切换可…

Python中套接字实现服务端和客户端3-3

3 创建客户端的步骤 创建客户端的步骤如图5所示。 图5 创建客户端的步骤 从图5可以看出&#xff0c;对于客户端来说&#xff0c;首先创建套接字&#xff0c;之后通过创建的套接字去连接服务端&#xff0c;如果连接成功&#xff0c;则继续通过该套接字向服务端发送数据&#x…

【Mybatis源码】IDEA中Mybatis源码环境搭建

一、Mybatis源码源 在github中找到Mybatis源码地址&#xff1a;https://github.com/mybatis/mybatis-3 找到Mybatis git地址 二、IDEA导入Mybatis源码 点击Clone下载Mybatis源码 三、选择Mybatis分支 选择Mybatis分支&#xff0c;这里我选择的是3.4.x分支

【ChatGPT】无需代理使用ChatGPT

推荐一个无需代理、可以直接使用的、免费的、无需客户端的、稳定的ChatGPT终端 支持GPT-3.5和CPT-4 无需境外手机号 该工具比较稳定&#xff0c;断流情况很少 GPTDOS 注册地址&#xff1a;GPTDOS &#xff08;使用我的邀请链接进行注册&#xff0c;双方都可以得到50000个toke…

Vue3 编译原理

文章目录 一、编译流程1. 解读入口文件 packgages/vue/index.ts2. compile函数的运行流程 二、AST 解析器1. ast 的生成2. 创建ast的根节点3. 解析子节点 parseChildren&#xff08;关键&#xff09;4. 解析模版元素 Element模版元素解析-举例分析 一、编译流程 1. 解读入口文…

嵌入式养成计划-33--数据库-sqlite3

七十一、 数据库 71.1 数据库基本概念 数据&#xff08;Data&#xff09; 能够输入计算机并能被计算机程序识别和处理的信息集合数据库 &#xff08;Database&#xff09;数据库是在数据库管理系统管理和控制之下&#xff0c;存放在存储介质上的数据集合 常用的数据库 大型数…

第二证券:5.5G时代将至 算力基建迎政策助力

昨日&#xff0c;A股全线低开&#xff0c;三大股指盘中均跌超1%&#xff0c;盘中冲高回落&#xff0c;午后逐渐止跌。到收盘&#xff0c;沪指跌0.44%报3096.92点&#xff0c;深成指微跌0.03%报10106.96点&#xff0c;创业板指跌0.26%报1998.61点&#xff0c;两市算计成交7700元…

【unity】制作一个角色的初始状态(左右跳二段跳)【2D横板动作游戏】

前言 hi~ 大家好&#xff01;欢迎大家来到我的全新unity学习记录系列。现在我想在2d横板游戏中&#xff0c;实现一个角色的初始状态-闲置状态、移动状态、空中状态。并且是利用状态机进行实现的。 本系列是跟着视频教程走的&#xff0c;所写也是作者个人的学习记录笔记。如有错…

linux centos出现No space left on device解决方案

问题是因为系统磁盘空间不足 解决方法: 找到那个磁盘不足问题 df -lh 发现/dev/mapper/cl-root磁盘已用50G,有如下 解决方案&#xff1a; 1、如果是虚拟机可以通过分配空间使其空间增加 2、将其他不常用磁盘空间分配给cl-root如&#xff08; /dev/mapper/cl-home &#…

unity 使用模拟器进行Profiler性能调试

这篇文章主要记录如何实现通过模拟器对打包的app游戏进行Profiler调试。主要记录一些比较重要的点。 准备工作 首先你要能够打包unity的安卓包&#xff0c;如果没有安装安卓组件&#xff0c;请先安装组件。 安装完成以后&#xff0c;会在unity的安装目录找到相应的SDK 这个…

嵌入式Linux裸机开发(五)中断管理

系列文章目录 文章目录 系列文章目录前言STM32 中断系统IMX6U中断控制8个中断GIC中断控制器GIC介绍中断IDGIC逻辑分块GIC协处理器 中断使能中断优先级 重点代码分析官方SDK函数start.S文件自行编写中断驱动文件 前言 最近在学习中发现&#xff0c;学Linux嵌入式不仅是对Linux的…

为Yolov7环境安装Cuba匹配的Pytorch

1. 查看Cuba版本 方法一 nvidia-smi 找到CUDA Version 方法二 Nvidia Control Panel > 系统信息 > 组件 > 2. 安装Cuba匹配版本的PyTorch https://pytorch.org/get-started/locally/这里使用conda安装 conda install pytorch torchvision torchaudio pytorch-cu…

JDK、JRE、JVM三者之间的关系

1.JDK 基本介绍 1) JDK 的全称 (Java Development Kit Java 开发工具包 ) JDK JRE java 的开发工具 [java, javac,javadoc,javap 等 ] 2) JDK 是提供给 Java 开发人员使用的&#xff0c;其中包含了 java 的开发工具&#xff0c;也包括了 JRE 。所以安装了 JDK &#xff0c;就…

论文研读|Protecting Intellectual Property of Deep Neural Networks with Watermarking

目录 论文信息文章简介研究动机研究方法水印生成水印嵌入版权验证 实验结果有效性&#xff08;Effectiveness&#xff09;高效性&#xff08;Converge Speed&#xff09;保真度&#xff08;Functionality&#xff09;鲁棒性&#xff08;Robustness&#xff09;Anti-剪枝攻击&am…

SpringBoot源码分析-自动装配-实现原理

文章目录 SpringBoot自动装配前言介绍实现原理SpringBootApplicationEnableAutoConfigurationselectImports方法没有走&#xff1f;DeferredImportSelector源码分析设计目的 总结 SpringBoot自动装配 前言 什么是自动装配&#xff1f;用过Spring的应该都知道&#xff0c;虽然…

MySQL总结练习题

目录 1.准备数据表 2.表之间的关系 3.题目 3.1 取得每个部门最高薪水的人员名称 3.2 哪些人的薪水在部门的平均薪水之上 3.3 取得部门中&#xff08;所有人的&#xff09;平均的薪水等级 3.4 不准用组函数&#xff08;Max &#xff09;&#xff0c;取得最高薪水 3.5 取…

【数据结构】归并排序和计数排序(排序的总结)

目录 一&#xff0c;归并排序的递归 二&#xff0c;归并排序的非递归 三&#xff0c;计数排序 四&#xff0c;排序算法的综合分析 一&#xff0c;归并排序的递归 基本思想&#xff1a; 归并采用的是分治思想&#xff0c;是分治法的一个经典的运用。该算法先将原数据进行拆…