C++指针解读(4)-- 指针和数组(一维数组)

news2024/11/26 18:54:20

1、数组及数组的访问

1.1 数组的存储方式

在内存中,数组是一块连续的区域。数组的存储结构有如下特点:

(1)数组中的元素是同质的数据;

(2)索引从0开始;

(3)数组在内存中的存储单元是连续的;

(4)数据元素是按顺序连续存放的;

比如数组:

int a[6] = {1, 2, 3, 3, 5, 6};

它在内存中的存储结构是这样的:

1.2 数组指针

访问数组可以用下标法访问,比如a[0]访问数组的第一个元素;也可以通过指针访问。在C语言中,数组名代表数组首个元素的地址。比如a与&a[0]是等价的。所以,我们可以通过*a访问数组的第1个元素,*(a+1)访问数组的第2个元素,等。

在用数组名时,有几个地方不能把数组名当首地址看:

(1)sizeof(a)求数组空间长度时。这里的a代表整个数组。注意这个sizeof()不是函数,是关键字,用来计算数据在内存中使用的字节数,是在编译时确定的。比如,sizeof(a) = 6*4 = 24个字节。

(2)&a表示取数组a的地址,跟&a[0]是不同的。

a只是代表数组首元素的地址,是指向数组首元素的指针;和指向这个数组的指针不是一码事。在指针变量的定义时我们知道,指针变量包含数据类型和指针名字,所以指向数组的指针的数据类型是数组,其指针值+1就代表地址往下移动 “每个数组元素字节*数组长度” 的字节数。而a+1指针只是往后移动1个数组元素字节。

int a[6] = {1, 2, 3, 3, 5, 6};
int *pi = &a[0];
pi = &a[1]; //可以的
pi = &a; //会报错,因为pi是个int指针,可以指向数组里的元素,但不能指向整个数组

int (*pi2)[6]; //指向包含6个int元素的数组的指针
pi2 = &a; //这么写就可以了

(3)数组赋值的错误方式:

char str[10];
str = "abcd"; //报错

int arr_i[10];
arr_i = { 1, 2, 3 }; //报错

正确的赋值方式:

char str[10];
strcpy(str, "abc");

int arr_i[10];
for (int i = 0; i < 10; i++) {
    arr_i[i] = i;
}

或者在定义的时候初始化:

char str[10] = "abcd";
int arr_i[10] = { 1, 2, 3 };

2、数组指针相关运算

2.1 基础运算规则

假如定义了下面的数组和数组指针:

int a[6] = {1, 2, 3, 3, 5, 6};
int *p1 = &a[0];
int *p2 = &a[2];

(1)p1表示数组的首地址,则p1+i表示数组元素a[i]的地址。

(2)*p1表示数组元素a[0]的值,*(p1+i)表示数组元素a[i]的值。

(3)p2 - 1表示上一个数组元素,即a[1];p2 + 1表示下一个数组元素,即a[3]。

(4)p2 - p1是2个地址之差。

int a[6] = { 1, 2, 3, 3, 5, 6 };
int* p1 = &a[0];
int* p2 = &a[2];

printf("%p\n", p1);
printf("%p\n", p2);

int size1 = (char)p2 - (char)p1; //转成char后的差才是字节数
int size2 = p2 - p1;
printf("size1 = %d, size2 = %d\n", size1, size2);

输出结果如下:

这里需要注意,因为p2、p1是地址,所以减之前要转成char,这样减的差值才是地址字节数。

2.2 数组指针运算应注意的几个问题

int a[6] = {1, 2, 3, 3, 5, 6};
int *p = a;

(1)*p++

从右往左读。因此它等价于*(p++)。++在变量后表示先返回变量的值,然后再+1。比如i++表示先返回i的值,然后i+1。所以*(p++)先返回*p的值,然后指针再加1,指向p+1,即a[2]的位置。

(2)*(p++)和*(++p)

我们知道i++表示先返回i的值,然后i+1;++i表示先i+1,然后返回i的值。所以*(++p)先把指针往下移动1个数组元素,然后再返回这个元素的值,即返回a[2]的值。

(3)++(*p)

从右往左读。先得到*p的值,即a[1]的值。然后把a[1]的值加1。

3、用数组名作函数参数

数组名作函数参数可以写成下面的形式:

func(int arr[], int len)
//或
func(int* parr, int len)

上面2种方式是等价的,另外要记住数组作形状参时,必须同时传入数组的长度,否则可能会造成读取数组越界。这里有人可能会有疑问,不是可以在函数里用sizeof(arr)去获取数组的长度吗?不行的,因为形参int arr[]其实传过来的是实参数组的首地址。所以函数里的sizeof(arr)返回的是指针的长度,在32位系统中是4个字节,64位系统中是8个字节。

3.1

(1)数组表示法

void print(int arr[], int len) {
    for (int i = 0; i < len; i++) {
        //printf("arr[%d] = %d\n", i, *(arr + i)); //这2种打印方法都可以
        printf("arr[%d] = %d\n", i, arr[i]); 
    }
}

int main()
{
    int a[6] = { 1, 2, 3, 3, 5, 6 };
    print(a, 6);

    return 0;
}

(2)指针表示法

void print(int *arr, int len) {
    for (int i = 0; i < len; i++) {
        printf("arr[%d] = %d\n", i, *(arr + i));
        //printf("arr[%d] = %d\n", i, arr[i]); //这2种打印方法都可以
    }
}

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

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

相关文章

数据库安全-H2 databaseElasticsearchCouchDBInfluxdb漏洞复现

目录 数据库安全-H2 database&Elasticsearch&CouchDB&Influxdb 复现influxdb-未授权访问-jwt 验证H2database-未授权访问-配置不当CouchDB-权限绕过配合 RCE-漏洞CouchDB 垂直权限绕过Couchdb 任意命令执行 RCE ElasticSearch-文件写入&RCE-漏洞Elasticsearch写…

Linux Kernel 4.13 RC6发布:正式版9月3日发布

美国当地时间上周末&#xff0c;大神Linus Torvalds发布了Linux Kernel 4.13内核的又一候选版本。上周发布的RC5版本更新幅度也要比上上周的RC4要小&#xff0c;Linus Torvalds表示本周发布的RC6版本属于常规更新&#xff0c;在过去一周的开发过程中并没有出现任何意外。RC6版本…

ESP32网络开发实例-从SD卡加载Web页面文件

从SD卡加载Web页面文件 文章目录 从SD卡加载Web页面文件1、应用介绍2、软件准备3、硬件准备4、Web页面代码实现5、Web服务器代码实现在文中,将展示如何构建一个 Web 服务器,为存储在SD卡中的 HTML 和 CSS 文件提供服务。 我们不必将 HTML 和 CSS 文本硬编码入代码中,而是创建…

如何提升网站排名和用户体验:优化网站速度

网站的排名和用户满意度直接受到站点内容的加载速度影响深远。通过精心的网站优化&#xff0c;您不仅可以提高排名&#xff0c;还可以提供更出色的用户体验&#xff0c;尽管用户可能不会察觉到您的网站加载得更快&#xff0c;但这是一个非常有意义的改进。在这篇文章中&#xf…

计算机毕业设计 基于Web铁路订票管理系统 火车订票管理系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Git纯操作版 项目添加和提交、SSH keys添加、远程仓库控制、冲突解决、IDEA连接使用

Git 文章目录 Git项目简单克隆通用操作添加和提交回滚分支变基分支优选 远程项目推送认证抓取、拉取和冲突解决 IEDA类软件连接 最近学原理学的快头秃了&#xff0c;特此想出点不讲原理的纯操作版&#xff0c;不过还是放个图吧 项目简单克隆 git在本人日常中最重要的功能还是…

ExposureDiffusion: Learning to Expose for Low-light Image Enhancement论文阅读笔记

南洋理工大学、鹏城实验室、香港理工大学在ICCV2023发表的暗图增强论文。用diffusion模型来进行raw图像暗图增强&#xff0c;同时提出了一个自适应的残差层用来对具有不同信噪比的不同区域采取不同的去噪策略。 方法的框图如下所示&#xff1a; 一张raw图片可以由信号和噪声…

scratch绘制多彩五角星 2023年9月中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析

目录 scratch绘制多彩五角星 一、题目要求 1、准备工作 2、功能实现 二、案例分析

Cadence 设计实践笔记-小哥allegro 2层板笔记

本章节主要跟着B站PCB入门首选视频-小哥Cadence Allegro 2层板视频,结合自己的实践一步步完成一个完整的PCB板的设计。 视频链接地址: PCB入门首选视频-小哥Cadence Allegro 2层板视频_哔哩哔哩_bilibili 规范建立文件夹 建立八个文件夹 DATASHEET 主要存放设计项目…

强化科技创新“辐射力”,中国移动的数智化大棋局

作者 | 曾响铃 文 | 响铃说 丝滑流畅的5G连接、每时每刻的数字生活服务、无处不在的智能终端、拟人交流的AI助手、梦幻般的XR虚拟现实、直接感受的裸眼3D…… 不知不觉&#xff0c;那个科幻片中的世界&#xff0c;越来越近。 数智化新世界的“气氛”&#xff0c;由一个个具…

window系统进行goolge代理配置(falcon proxy+burpsuite)

linux系统自带burpsuite抓包软件&#xff0c;只要火狐下个代理扩展就可以抓包了&#xff0c;想着每次抓包还得去虚拟机抓就有点小烦躁&#xff0c;所以想着给自己本机也弄个burpsuite&#xff0c;有想法就开整&#xff01; 一、goole代理扩展插件falcon proxy 1、由于goole应…

项目管理工具的功能与帮助一览

项目管理的概念并不新鲜&#xff0c;但是伴随着技术解决方案的出现&#xff0c;项目管理工具帮助企业建立规范科学的管理流程&#xff0c;为企业的管理工作提供助力。 Zoho Projects 是一款适合全行业的标准化项目管理工具&#xff0c;它提供了重要的功能&#xff0c;如任务列…

海康威视、大华、宇视rtsp实时读取网络摄像头

目录 1 RTSP介绍 1.海康 1.2 大华 1.3 宇视 2.实时读取 2.1 cv2.VideoCapture打开视频流 2.2 ffmpeg打开视频流 2.3 c 1 RTSP介绍 RTSP&#xff08;Real-Time Streaming Protocol&#xff09;是一种用于实时流媒体传输的网络协议。它被设计用于在客户端和服务器之间传输…

双指针--浅试

在做题中发现一件很奇怪的事情&#xff1a; 我看到了题目描述&#xff0c;心中有了一个解题的思路&#xff0c;然后尝试解题&#xff0c;看题解的时候发现“双指针法”我很熟悉但是又感觉不太懂。 把题解代码看了以后却与我的代码大差不差&#xff0c;才恍然大悟&#xff0c;原…

非类型模板参数+模板的特化

目录 一、非类型模板参数 二、模板的特化 &#xff08;一&#xff09;函数模板特化 &#xff08;二&#xff09;类模板举例 1. 全特化 2. 偏特化 一、非类型模板参数 模板参数分类&#xff1a;类型形参与非类型形参。类型形参即&#xff1a;出现在模板参数列表中&#x…

String、StringBuilder、StringBuffer区别

String、StringBuilder、StringBuffer区别 面试官&#xff1a;请你谈谈String、StringBuilder、StringBuffer区别 作为经典Java八股&#xff0c;是面试必考的热门点。 下面让我们一起来看一下他们的区别吧&#xff01; 主要是测试他们的效率和应用场景&#xff0c;具体语法不在…

苍穹外卖(六) redis缓存解决数据库压力

二节 直接用代码操作redis缓存 三, 四节 间接使用Spring Cache 注解完成redis缓存操作 可直接看三,四节 需要帮助理解注释 回去看第二节 一.问题说明 二. 实现思路 通过Redis来缓存菜品数据, 减少数据库查询操作 Redis简介 Redis是一个基于内存的key-value结构数据库。Redi…

2. vue-sy-admin: 基于vue3+TypeScript的自定义指令(directives)的封装及示例

自定义指令directives在项目特别是后台管理类的项目中使用的尤其多(个人经验)&#xff0c;每个人编写的自定义指令也各不相同&#xff0c;一个人的时候还没啥感觉&#xff0c;在多人合作的项目中统一编码规范就变得很有必要了&#xff0c;这样看着舒服的同时也更方便后期维护。…

【PyTorchTensorBoard实战】GPU与CPU的计算速度对比(附代码)

0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解&#xff0c;但是内容可能存在不准确的地方。如果发现文中错误&#xff0c;希望批评指正&#xff0c;共同进步。 本文基于PyTorch通过tensor点积所需要的时…

【VSCode】Windows环境下,VSCode 搭建 cmake 编译环境(VSCode 插件配置)

目录 一、下载编译器 1、下载 Windows GCC 2、选择编译器路径 二、下载插件 三、配置 cmake generator 四、编译工程 一、下载编译器 1、下载 Windows GCC 这里是在Windows环境下&#xff0c;所以下载的是 Windows 环境使用的 gcc 编译器。 下载地址: MinGW-w64 - for…