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

大话C语言:第31篇 指针和数组的关系

数组在内存中是连续存放的,其名称代表了数组首元素的首地址,该地址是常量, 也就是一个指向数组首元素的指针。因此,指针和数组有着密切的关系:

  • 可以使用指针来访问和操作数组中的元素。通过指针的算术运算,可以移动指针的指向,使其指向数组中的其他元素。这种指针的运算在数组操作中非常常见,可以灵活地遍历和处理数组元素。

  • 数组的下标运算符[]实际上是以指针作为其操作数的。这意味着数组元素可以通过指针来引用,而指针也可以用下标形式来表示。这种等价性可以用指针来实现原本用数组实现的操作,从而提供了更多的灵活性和可能性。

  • 当数组作为函数形参时,它会退化为指向数组首元素的指针。

1 指针访问数组

指针访问数组元素是一种常见且高效的操作方式。数组在内存中是连续存储的,而数组名在大多数上下文中会退化为指向数组首元素的指针。因此,可以通过这个指针加上偏移量来访问数组中的任意元素。

指针访问数组元素的定义通常涉及以下步骤:

  • 定义数组:需要定义一个数组并初始化它。

int array[] = {1, 2, 3, 4, 5};
  • 获取数组首元素的地址:数组名 array 在这个上下文中会退化为指向数组首元素(即 array[0])的指针

// ptr 现在指向 array[0]
int *ptr = array; 
  • 使用指针访问数组元素:通过给指针加上适当的偏移量,可以访问数组中的其他元素。偏移量通常是元素大小的整数倍。

int element = *(ptr + index); // 访问数组中的第 index+1 个元素
  • 遍历数组:可以通过递增指针来遍历整个数组。

for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++) 
{  printf("%d ", *(ptr + i)); // 打印数组中的每个元素  
}

扩展,

指针访问数组元素的方法包括:

  • 指针名加数组元素下标,语法格式:

// 数组定义
数据类型 数组名 = {初始值};// 定义指针并指向数组首地址
数据类型 *指针变量 = 数组名;// 指针加数组下标,访问具体数组元素
指针变量[数组下标];

代码示例:

#include <stdio.h>  int main()
{  // 定义数组int array[] = {1, 2, 3, 4, 5};  // 定义指针并指向数组首地址int *ptr = array; // 通过数组下标访问元素,注意,不要下标不要超过了(数组长度 - 1)// 访问数组中第2个元素,相当于array[1]printf("%d\n", ptr[1]); // 访问数组中第4个元素,相当于array[3]printf("%d\n", ptr[3]);return 0;  
}
  • 指针变量运算,语法格式:

// 数组定义
数据类型 数组名 = {初始值};// 定义指针并指向数组首地址
数据类型 *指针变量 = 数组名;// 指针加数组下标
*(指针变量 + 数组下标);

代码示例:

#include <stdio.h>  int main()
{  // 定义数组int array[] = {1, 2, 3, 4, 5};  // 定义指针并指向数组首地址int *ptr = array; // 通过数组下标访问元素,注意,不要下标不要超过了(数组长度 - 1)// 访问数组中第2个元素,相当于array[1]printf("%d\n", *(ptr + 1));// 访问数组中第4个元素,相当于array[3]printf("%d\n", *(ptr + 3));return 0;  
}

2 指针修改数组

既然指针可以访问数组元素,那么,可以通过指针对数组元素进行修改,包括:

  • 指针名加数组元素下标,语法格式:

// 数组定义
数据类型 数组名 = {初始值};// 定义指针并指向数组首地址
数据类型 *指针变量 = 数组名;// 指针加数组下标,修改具体数组元素
指针变量[数组下标] = 常量或者变量;

代码示例:

#include <stdio.h>  int main()
{  // 定义数组int array[] = {1, 2, 3, 4, 5};  // 定义指针并指向数组首地址int *ptr = array; // 通过数组下标访问元素,注意,不要下标不要超过了(数组长度 - 1)// 访问数组中第2个元素,相当于array[1]printf("数组第2个元素修改前的值是%d\n", ptr[1]); // 修改数组中第2个元素ptr[1] = 10;printf("数组第2个元素修改后的值是%d\n", ptr[1]);return 0;  
}
  • 指针变量运算,语法格式:

// 数组定义
数据类型 数组名 = {初始值};// 定义指针并指向数组首地址
数据类型 *指针变量 = 数组名;// 指针加数组下标,修改具体数组元素
*(指针变量 + 数组下标) = 常量或者变量;

代码示例:

#include <stdio.h>  int main()
{  // 定义数组int array[] = {1, 2, 3, 4, 5};  // 定义指针并指向数组首地址int *ptr = array; // 通过数组下标访问元素,注意,不要下标不要超过了(数组长度 - 1)// 访问数组中第2个元素,相当于array[1]printf("数组第2个元素修改前的值是%d\n", *(ptr + 1)); // 修改数组中第2个元素*(ptr + 1) = 10;printf("数组第2个元素修改后的值是%d\n", *(ptr + 1));return 0;  
}

3 指针运算

  • 指针加整数(假设为n),含义是从当前地址向下移动数据类型长度*n(相当于sizeof(数据类型) * n)的地方,运算的结果指针指向新的地址。注意,指针移动至非法的位置。

#include <stdio.h>  int main()
{  // 定义数组int array[] = {1, 2, 3, 4, 5};  // 定义指针并指向数组首地址int *ptr = array; // 打印指针当前指向地址的内容printf("指针当前指向地址的内容是%d\n", *ptr); // 移动指针// 相当于访问数组中第3个元素ptr += 2;printf("移动两个位置后的指针当前指向地址的内容是%d\n", *ptr); return 0;  
}
  • 相同类型指针可以比较大小

#include <stdio.h>  int main()
{  // 定义数组int array[] = {1, 2, 3, 4, 5};  int *ptr1 = &array[1]; int *ptr2 = &array[3];if (ptr1 > ptr2){printf("ptr1指向地址高于ptr2指向地址\n"); }else if (ptr1 < ptr2){printf("ptr1指向地址低于ptr2指向地址\n"); }else {printf("ptr1和ptr2指向相同空间\n");}return 0;  
}
  • 相同类型的指针可以做减法,可以计算出它们之间相隔的元素个数。

#include <stdio.h>  int main()
{  // 定义数组int array[] = {1, 2, 3, 4, 5};  int *ptr1 = &array[1]; int *ptr2 = &array[3];printf("ptr1和ptr2之间相隔元素个数为%d\n", ((ptr1 > ptr2) ? (ptr1 - ptr2) : (ptr2 - ptr1)));return 0;  
}
  • 相同类型的指针可以相互赋值,注意,void*类型除外。

#include <stdio.h>  int main()
{  // 定义数组int array[] = {1, 2, 3, 4, 5};  int *ptr1 = &array[1]; int *ptr2 = ptr1;printf("ptr1的地址是%p\n", ptr1);printf("ptr2的地址是%p\n", ptr2);return 0;  
}

相关文章:

大话C语言:第31篇 指针和数组的关系

数组在内存中是连续存放的&#xff0c;其名称代表了数组首元素的首地址&#xff0c;该地址是常量&#xff0c; 也就是一个指向数组首元素的指针。因此&#xff0c;指针和数组有着密切的关系&#xff1a; 可以使用指针来访问和操作数组中的元素。通过指针的算术运算&#xff0c;…...

Mysql-索引应用

目录 索引应用 MySQL有哪些索引? 普通索引和唯一索引有什么区别? 哪个更新性能更好? 、 聚簇索引的主键索引怎么设置? 追问:假如你不设置会怎么样? 我们一般选择什么样的字段来建立索引? 索引越多越好吗? 索引怎么优化? &#xff08;覆盖索引优化、防止索引失效、…...

Facebook 开源计算机视觉 (CV) 和 增强现实 (AR) 框架 Ocean

Ocean 是一个独立于平台的框架&#xff0c;支持所有主要操作系统&#xff0c;包括 iOS、Android、Quest、macOS、Windows 和 Linux。它旨在彻底改变计算机视觉和混合现实应用程序的开发。 Ocean 主要使用 C 编写&#xff0c;包括计算机视觉、几何、媒体处理、网络和渲染&#x…...

【接口自动化_13课_接口自动化总结】

一、自我介绍 二、项目介绍 自己的职责、项目流程 1&#xff09;功能测试&#xff0c;怎么设计用例的--测试策略 2&#xff09;功能测试为什么还有代码实现&#xff0c;能用工具实现&#xff0c;为什么还用代码实现。 基本情况 项目名称:项目类型&#xff1a;项目测试人员…...

安防管理平台LntonCVS视频汇聚融合云平台智慧火电厂安全生产管理应用方案

中国的电力产业作为国民经济发展的重要能源支柱&#xff0c;被视为国民经济的基础产业之一。目前&#xff0c;我国主要依赖火力发电&#xff0c;主要燃料包括煤炭、石油和天然气等&#xff0c;通过燃烧转化为动能&#xff0c;再转变为电能输送至全国各地。火力发电量占全国发电…...

【Web性能优化】在Vue项目中使用defer优化白屏,秒加载!

历史小剧场 相对而言&#xff0c;流芳千古的钱谦益先生&#xff0c;就有点儿区别了&#xff0c;除了家产外&#xff0c;也很能挣钱&#xff08;怎么来的就别说了&#xff09;&#xff0c;经常出没红灯区&#xff0c;六十岁多了&#xff0c;还娶了柳如是&#xff0c;明朝亡时&am…...

springboot上传图片

前端的name的值必须要和后端的MultipartFile 形参名一致 存储本地...

python入门:python及PyCharm安装

前言 我们将详细介绍如何在系统上安装Python及使用PyCharm创建项目的具体流程。Python是一种广泛应用的编程语言&#xff0c;其简单易学的特点使其成为初学者的首选。而PyCharm则是一个功能强大的Python IDE&#xff0c;可以极大地提高开发效率。通过本文&#xff0c;你将学会…...

链接追踪系列-04.linux服务器docker安装elk

[rootVM-24-17-centos ~]# cat /proc/sys/vm/max_map_count 65530 [rootVM-24-17-centos ~]# sysctl -w vm.max_map_count262144 vm.max_map_count 262144 #先创建出相应目录&#xff1a;/opt/dockerV/es/…docker run -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -d -p 92…...

深入探讨微服务架构设计模式与常见实践

深入探讨微服务架构设计模式与常见实践 引言 在现代软件开发中&#xff0c;微服务架构因其灵活性和可扩展性被广泛采用。本文将深入探讨微服务架构的设计理念和常见模式&#xff0c;详细介绍每个模式的实现方法&#xff0c;并分别提供适用于Ubuntu和CentOS的具体命令和代码示…...

【java】合并数组的两种方法

文章目录 1.利用arraycope的方法2.将两数组合并 &#xff0c;在排序 1.利用arraycope的方法 public class MergeArr {public static void main(String[] args) {int[] arr1 {1,2,3,4,5,6};int[] arr2 {7,8,9};//合并完的数组int[] arr3 new int[arr1.length arr2.length];…...

[图解]分析模式-01-概述1

1 00:00:01,380 --> 00:00:01,770 好 2 00:00:02,340 --> 00:00:06,440 非常感谢大家能够来上我们 3 00:00:06,450 --> 00:00:07,960 分析模式高阶的课程 4 00:00:09,310 --> 00:00:13,440 这个内容之前在分析设计高阶 5 00:00:13,450 --> 00:00:17,840 也就…...

【网络安全】Oracle:SSRF获取元数据

未经许可&#xff0c;不得转载。 文章目录 前言正文漏洞利用 前言 Acme 是一家广受欢迎的播客托管公司&#xff0c;拥有庞大的客户群体。与许多大型运营公司一样&#xff0c;Acme 采用了Apiary的服务&#xff0c;使用户能够安全高效地管理他们的播客。 Apiary 于2017年初被Or…...

Android Bitmap

在Android开发中&#xff0c;位图&#xff08;Bitmap&#xff09;是一个非常重要的图形处理对象&#xff0c;它用于在内存中存储图像数据。以下是关于Android中位图使用的一些关键点和方法&#xff1a; 一、获取位图 从资源文件中获取&#xff1a; 使用BitmapFactory类&#…...

2024 年全国青少年信息素养大赛 Python 小学组复赛真题

2024 年全国青少年信息素养大赛 Python 小学组复赛真题 《伶俐角少儿编程》gzh查看所有题目 第一题 题目描述 在一个神秘的王国里,国王希望通过一个简单的测试来评估他的子民对基础数学运算的掌握情况。他决定让每个人输入一个正整数 N (0≤N≤1000),然后计算并输出(5N)的值…...

C语言——流程控制:if...else、switch...case

控制类语句&#xff1a; 逻辑运算符&#xff1a; 选择语句&#xff1a; if...else&#xff1a; if&#xff08;&#xff09;括号内的内容终究会被转换成0,1&#xff0c;满足的话即为1&#xff0c;不满足的话为0。因此要注意&#xff0c;&#xff08;&#xff09;括号内因为条件…...

小白的OS Copilot 产品测评

背景 通过群友介绍才知OS Copilot 。不想错过任何优秀的AI产品。随着互联网的发展和时代的进步&#xff0c;要紧跟时代&#xff0c;了解市面上的优秀的AI科技产品。 OS Copilot 产品体验评测 1&#xff09;您的角色是什么&#xff1f;开发、运维、学生&#xff1f;如果使用O…...

使用Scikit-Learn决策树:分类问题解决方案指南

如何用scikit-learn的决策树分类器解决分类问题 1. 引言 在本教程中&#xff0c;我们将探讨如何使用scikit-learn&#xff08;sklearn&#xff09;库中的决策树分类器解决分类问题。决策树是一种强大的机器学习算法&#xff0c;能够根据输入数据的特征属性学习决策规则&#…...

E12.【C语言】练习:求两个数的最大公约数

1.枚举 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {int a 0;int b 0;int tmp 0;scanf("%d %d", &a, &b);if (a < b){for (int i1; i < a; i){if (0a% i && 0b%i)tmp i;}}if (a>b){for (int i 1; i <…...

Elasticsearch:介绍 retrievers - 搜索一切事物

作者&#xff1a;来自 Elastic Jeff Vestal, Jack Conradson 在 8.14 中&#xff0c;Elastic 在 Elasticsearch 中引入了一项名为 “retrievers - 检索器” 的新搜索功能。继续阅读以了解它们的简单性和效率&#xff0c;以及它们如何增强你的搜索操作。 检索器是 Elasticsearc…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...