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

【C语言基础入门】二级指针、一维数组与指针、二维数组与指针

文章目录

  • 前言
  • 一. 二级指针
    • 1.1 二级指针是什么?
    • 1.2 二级指针使用示例
    • 1.3 拓展:n级指针
  • 二. 一维数组与指针:
    • 2.1 利用指针遍历数组:
    • 2.2 指针数组
    • 2.3 数组指针
  • 三、 二维数组指针
    • 3.1 二维数组指针是什么?
      • 示例代码
    • 3.2 指针数组
      • 示例代码
    • 3.3 利用指针遍历二维数组:
  • 总结


前言

在学习C语言的过程中,理解指针的概念是非常重要的。指针提供了一种直接访问内存地址的方式,使得我们可以更加灵活地管理数据和内存。在本文中,我们将介绍C语言中的二级指针、一维数组与指针,并通过通俗易懂的语言和示例代码来帮助读者理解这些概念。


一. 二级指针

1.1 二级指针是什么?

二级指针是指指向指针的指针。用更简单的话来说,就像你有一张地图,上面有一个标记,这个标记实际上是指向另一张地图的指针。你实际上有两层地图,一层指向另一层。

1.2 二级指针使用示例

#include <stdio.h>int main() {int num = 42;int *ptr1 = &num;   // 一级指针,指向整数int **ptr2 = &ptr1; // 二级指针,指向指针的指针printf("Value of num: %d\n", **ptr2);return 0;
}

在这里插入图片描述

在这个示例中,ptr2 是一个指向 ptr1 的指针,通过两次解引用操作可以获取到 num 的值。

除了二级指针,还有 n 级指针,表示指向指针的指针的…的指针。以下是一个三级指针的示例:

1.3 拓展:n级指针

int ***ptr3 = &ptr2; // 三级指针,指向指针的指针的指针

在这里插入图片描述

理解这种多层指针时,关键是逐层解读每个指针的作用。

二. 一维数组与指针:

2.1 利用指针遍历数组:

#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int *ptr = arr; // 数组名本身就是一个指向数组首元素的指针for (int i = 0; i < 5; ++i) {printf("%d ", *(ptr + i));}return 0;
}

在这里插入图片描述

这里,ptr 指向数组的第一个元素,通过指针的偏移遍历整个数组。

2.2 指针数组

#include <stdio.h>int main() {int a = 1, b = 2, c = 3;int *arr[] = {&a, &b, &c}; // 指针数组for (int i = 0; i < 3; ++i) {printf("%d ", *(arr[i]));}return 0;
}

在这里插入图片描述

在这个示例中,arr 是一个指针数组,存储了三个整数指针,通过数组下标访问各个指针。

2.3 数组指针

#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int (*ptr)[5] = &arr; // 数组指针for (int i = 0; i < 5; ++i) {printf("%d ", (*ptr)[i]);}return 0;
}

在这里插入图片描述

这里,ptr 是一个指向包含5个整数的数组的指针。

三、 二维数组指针

3.1 二维数组指针是什么?

二维数组指针是指向二维数组的指针。它通常用于处理多维数组的情况,允许对二维数组进行更灵活的操作。
二维数组指针的声明类似 int (*ptr)[N],其中 ptr 是指向包含N列的整数数组的指针。

示例代码

#include <stdio.h>int main() {int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};int (*ptr)[3] = arr; // 指向二维数组的指针for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) {printf("%d ", ptr[i][j]);}printf("\n");}return 0;
}

在这里插入图片描述

3.2 指针数组

指针数组是一个数组,其元素都是指针。通常用于存储多个指向不同数据类型的指针。
例如,int *ptrArr[3] 表示一个包含3个整数指针的数组。

示例代码

#include <stdio.h>int main() {int a = 1, b = 2, c = 3;int *ptrArr[3] = {&a, &b, &c}; // 指针数组for (int i = 0; i < 3; i++) {printf("%d ", *(ptrArr[i]));}return 0;
}

在这里插入图片描述

3.3 利用指针遍历二维数组:

指针也可以用于遍历二维数组,通过指针的偏移来访问数组的元素。
示例代码:

#include <stdio.h>int main() {int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};int *ptr = &arr[0][0]; // 指向二维数组的首元素for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) {printf("%d ", *ptr);ptr++; // 移动指针到下一个元素}printf("\n");}return 0;
}

这些示例代码展示了如何使用二维数组指针、指针数组以及指针来遍历二维数组。这些概念在处理多维数据结构时非常有用,使你能够更有效地操作和管理数据。

在这里插入图片描述


总结

C语言中的指针提供了强大的工具,通过了解和灵活运用指针,我们能够更有效地操作内存,实现复杂的数据结构和算法。二级指针为多级指针的概念提供了基础,而一维数组与指针的结合则在处理数组数据时提供了便捷的方式。在实际编程中,灵活运用这些概念可以让程序更加高效、清晰。
这些概念在处理多维数据结构时非常有用,使你能够更有效地操作和管理数据。

相关文章:

  • 软通杯算法竞赛--周赛题目(一)
  • 【微服务】mysql + elasticsearch数据双写设计与实现
  • 艺术的维度:洞察AI诈骗,优雅防范之艺术
  • C++构造函数
  • docker 下安装mysql8.0
  • ROS学习笔记(4):ROS架构和通讯机制
  • 大数据毕业设计选题推荐-热门旅游景点数据分析-Hadoop-Spark-Hive
  • 解析python爬取Ebay数据的方式
  • C#when关键字
  • uniapp写一个计算器用于记账(微信小程序,APP)
  • 【强化学习】17 ——DDPG(Deep Deterministic Policy Gradient)
  • 软考 系统架构设计师系列知识点之数字孪生体(1)
  • hive的安装配置笔记
  • 前端面试大纲
  • IDEA 设置代码注释模板
  • [译] 怎样写一个基础的编译器
  • 2019年如何成为全栈工程师?
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • export和import的用法总结
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript新鲜事·第5期
  • java取消线程实例
  • jquery cookie
  • Netty 4.1 源代码学习:线程模型
  • Quartz初级教程
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 程序员最讨厌的9句话,你可有补充?
  • 面试总结JavaScript篇
  • 那些年我们用过的显示性能指标
  • 区块链将重新定义世界
  • 驱动程序原理
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 手写双向链表LinkedList的几个常用功能
  • 用 Swift 编写面向协议的视图
  • 智能合约开发环境搭建及Hello World合约
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (11)MATLAB PCA+SVM 人脸识别
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (Forward) Music Player: From UI Proposal to Code
  • (Python第六天)文件处理
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .Net Winform开发笔记(一)
  • .net 提取注释生成API文档 帮助文档
  • .NET的微型Web框架 Nancy
  • .NET开源项目介绍及资源推荐:数据持久层