C语言如何使⽤指针操作数组?

一、问题

        指针到底该如何操作数组?

二、解答

        实践和程序结果可以让我们产⽣疑问,但同时也是解决问题的重要依据,所以⾸先看 ⼀个演示程序。代码如下。

#include <stdio.h>
int main()
{int i, a[6] = {19, 89, 2, 1, 12, 25};int *p = a;for (i = 0; i <= 5; i++){printf("(a+%d)=%d\n", i, *(a + i));}printf("\n");for (i = 0; i <= 5; i++){printf("*(p+%d)=%d\n", i, *(p + i));}return 0;
}

        运⾏结果如图所示。

(a+0)=19
(a+1)=89
(a+2)=2
(a+3)=1
(a+4)=12
(a+5)=25*(p+0)=19
*(p+1)=89
*(p+2)=2
*(p+3)=1
*(p+4)=12
*(p+5)=25

        从图中可以看出,数组元素 a[0] 和指针 *(p+0) ,a[1] 和 *(p+1) ……它们每组取出的值都分别相同,也就说明在引⽤指针后,对数组的操作可以使⽤指针,⽽且可以更⽅便地进⾏元素的访问。

        当使⽤指针指向数组的⾸地址后,指针可以像数组的别名⼀样,进⾏下标操作,但是这些似乎意义都不⼤,指针操作数组的优点主要体现在对数组元素进⾏顺序操作的时候。

        在上⾯的程序中有这样⼀段代码。

for (i = 0; i <= 5; i++)
{printf("*(p+%d)=%d\n", i, *(p + i));
}

        上⾯这段代码完全可以写成如下的格式。 

for (i = 0; i <= 5; i++)
{printf("*p++=%d\n", *p++);
}

         两段代码中,第⼆段就是每执⾏⼀次循环,指针先执⾏⼀次取值运算,然后⾃加⼀次, 将指针位置后移⼀个单位,⼀直循环操作,直到循环体结束。要注意的是,循环结束后, 指针的位置是在数组所占内存单元的后⾯⼀个内存单元,⽽不是指向数组的最后⼀个内存单元。

        上⾯代码中还有这样⼀段代码。

for (i = 0; i <= 5; i++)
{printf("(a+%d)=%d\n", i, *(a + i));
}

        那么,这段代码可不可以改成如下形式呢?

for (i = 0; i <= 5; i++)
{printf("*a++=%d\n", *a++);
}

        很遗憾,编译出错。这样看来,数组名和指针还是有区别的。那么为什么会出错呢? 原因在于指针是指针变量,可以通过运算改变它们的值,但是数组名是常量,常量的值是不允许改变的。

三、总结

        操作计算中的⼏个区分问题:

*p++,由于 ++ 是后置运算,这⾥先得到的是 p 指向变量的值,即先执⾏*p,然后执⾏ ++ 运算。*(++p),这⾥先运算 ++p,也就是 p 先⾃增⼀次,然后进⾏取值运算。(*p)++,先将 p 指针指向的地址值中的数据取出,然后将取出的数据值⾃增⼀次运算。

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

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

相关文章

什么是IIoT?

什么是IIoT? IIoT,即工业物联网(Industrial Internet of Things),是指将物联网技术应用到工业领域,通过微型低成本传感器、高带宽无线网络等技术手段,实现工业设备、系统和服务的互联互通,从而提高生产效率、降低能耗和成本,实现智能化和自动化生产。 IIoT的应用范围…

网络安全是否有需求

● 由于网络威胁数量不断增加&#xff0c;网络安全的需求很高。 ● 组织正在大力投资网络安全以保护其数据。 ● 就业市场缺乏熟练的网络安全专业人员。 ● 网络安全认证可以提升您在网络安全领域的职业前景。 ● 持续学习并了解最新的安全趋势在该领域至关重要。 随着对技术和…

vue3去掉el-table底部白色边框

加入下面这一行代码就行了&#xff0c;我用的是less :deep(.el-table__inner-wrapper:before) {background: none;}效果图

软件开发的一般步骤

软件开发一般遵循一套标准化的流程&#xff0c;旨在确保项目的高效实施、产品质量可控以及最终用户满意度。以下是软件开发的一般步骤&#xff1a; 1. 需求分析 用户需求收集&#xff1a;通过访谈、问卷调查、观察用户工作流程等方式&#xff0c;从最终用户、业务人员、项目发…

使用PyCharm开发工具创建工程

一. 简介 前面文章实现了开发 python程序使用的 开发工具PyCharm&#xff0c;本文来学习使用 PyCharm开发工具创建一个 python工程。 二. 使用PyCharm开发工具创建工程 1. 首先&#xff0c;打开 PyCharm开发工具&#xff0c;打开 "New project" 选项&#xff1a; …

laravel 使用微信的图片内容检测及文字内容检测

文字内容检测 const SEC_LABEL [100 > 正常,10001 > 广告,20001 > 时政,20002 > 色情,20003 > 辱骂,20006 > 违法犯罪,20008 > 欺诈,20012 > 低俗,20013 > 版权,21000 > 敏感,];/*** 检测文字安全* param $openid openid* param $content 检…

Unity 数据持久化——persistentDataPath储存路径

Unity中&#xff1a; StreamingAssets的文件夹,特点是:只能读,不能写. persistentDataPath可读可写&#xff08;但是,此文件夹在Editor阶段没有&#xff0c;手机安装App后自动生成&#xff09; 可以将一些必需的文件先放在StreamingAssets,在App安装后Copy到persistentDataP…

详解数据结构:队列(含栈与队列扩展)

一、顺序队列 有一种线性序列&#xff0c;特点是先进先出&#xff0c;这种存储结构称为队列。队列也是一种线性表&#xff0c;只不过它是操作受限的线性表&#xff0c;只能再两端操作&#xff1a;一端进、一端出。进的一端称为队尾&#xff0c;出的一端称为队头。队列可以用顺…

C# 计算两个坐标点直接的距离

在C#中计算两个坐标点之间的距离时&#xff0c;方法的选择取决于坐标系的类型以及您需要处理的具体情况。以下是几种常见场景下的计算方法&#xff1a; 1. 平面直角坐标系中的两点距离 在二维平面直角坐标系中&#xff0c;给定两个点A(x1, y1)和B(x2, y2)&#xff0c;它们之间…

Sharding-JDBC 5.0.0快速集成Springboot2.3.2【读写分离】

Sharding-JDBC 5.0.0快速集成Springboot2.3.2 引入依赖&#xff1a; <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.0.0</version> …

自己实现httpsession

package com.kongjs.emo.web.session;import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionContext; import java.util.*; // 实现类 public class Session implements HttpSession {private String id;privat…

20240424codeforces刷题题解

240424刷题题解 Walk on Matrix CodeForces - 1332D 思路 构造题&#xff0c;每个 d p i , j dp_{i,j} dpi,j​​​都是由其左上方向中的按位与最大值决定的。 我们需要从使得贪心解与正确解的差值为 k k k。 为了方便获得 k k k&#xff0c;可以考虑构造一个贪心解为 0…

Windows批处理脚本,用于管理Nginx服务器

先看截图&#xff1a; Windows批处理脚本&#xff0c;用于管理Nginx服务器。它提供了启动、重启、关闭Nginx以及刷新控制台等功能。 设置环境变量&#xff1a; set NGINX_PATHD:&#xff1a;设置Nginx所在的盘符为D盘。set NGINX_DIRD:\nginx1912\&#xff1a;设置Nginx所在…

HTML5+CSS3小实例:炫彩荧光线条登录框

实例:炫彩荧光线条登录框 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-sca…

每日一题---环形链表的约瑟夫问题

文章目录 前言1.题目2.解题思路2.1创建节点 2.2.创建环形链表2.3.进行遍历 4参考代码 前言 前段时间我们学习到了单链表和双向链表的相关知识&#xff0c;下面我们解决一道具有代表性的一个编程题。 牛客网—环形链表的约瑟夫问题 1.题目 2.解题思路 2.1创建节点 //创建节点…

flink入门程序(一)

Flink中提供了3个组件&#xff0c;包括DataSource、Transformation和DataSink。 DataSource&#xff1a;表示数据源组件&#xff0c;主要用来接收数据&#xff0c;目前官网提 供了readTextFile、socketTextStream、fromCollection以及一些第三方的Source。 Transformation&…

scratch选择火车下铺 2024年3月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析

目录 scratch根据身份证号码识别是否优先选择火车下铺 一、题目要求 1、准备工作 2、功能实现 二、案例分析

25计算机考研院校数据分析 | 复旦大学

复旦大学(fudan University)&#xff0c;简称"复旦”&#xff0c;位于中国上海&#xff0c;由中华人民共和国教育部直属&#xff0c;中央直管副部级建制&#xff0c;位列985工程、211工程、双一流A类&#xff0c;入选“珠峰计划"、"111计划""2011计划…

理解CSS中的sticky与fixed定位

在CSS中&#xff0c;position: sticky; 和 position: fixed; 是两种常见的定位方式&#xff0c;它们可以让元素脱离文档流&#xff0c;并具有固定位置的效果。然而&#xff0c;它们在实际应用中有着不同的特点和使用场景。 sticky定位 特点&#xff1a;position: sticky; 允许…

【学习】软件测试自动化,是未来的趋势还是当前的必需

在当今快速迭代的软件开发周期中&#xff0c;速度和质量成为了企业生存的关键。随着DevOps实践的普及和持续集成/持续部署&#xff08;CI/CD&#xff09;流程的标准化&#xff0c;软件测试自动化已经从未来的趋势转变为当前的必要性。本文将探讨自动化测试的现状、必要性以及其…