C++ — 指针和数组的关系?

news2024/12/28 4:38:57

在本文中,您将了解数组与指针之间的关系,并在程序中有效地使用它们。

指针是保存地址的变量。指针不仅可以存储单个变量的地址,还可以存储数组单元的地址。

看以下示例:

int* ptr; // 定义指针变量ptr
int a[5];
ptr = &a[2];  // &a[2]是a[5]这个数组的第三个元素的地址。

        假设指针需要指向数组的第四个元素,即在上述情况下的第四个数组元素的保存地址。由于ptr指向上面示例中的第三个元素,ptr + 1将指向第四个元素。您可能会认为,ptr +1为您提供了ptr的下一个字节的地址。 但这是不正确的。这是因为指针ptr是指向int的指针,并且int的大小对于操作系统是固定的(64位操作系统中int类型大小是4字节)。 因此,ptr和ptr +1之间的地址相差4个字节。如果指针ptr是指向char的指针,那么ptr和ptr + 1之间的地址将相差1个字节,因为一个字符的大小是1个字节。

示例1:C ++指针和数组

C ++程序使用数组和指针显示数组元素的地址


#include <iostream>

int main() {
	float arr[5]; // 定义浮点型数组
	float* ptr; // 定义一个浮点型指针变量ptr
	std::cout << "使用数组显示地址:" << std::endl;
	for (int i = 0; i < 5; i++) {
		std::cout << "&arr[" << i << "]=" << &arr[i] << std::endl;
	}
	ptr = arr; // 将arr数组的首地址赋给指针变量ptr
	std::cout << "\n使用指针显示地址" << std::endl;
	for (int i = 0; i < 5; i++) {
		std::cout << "ptr+" << i << "=" << ptr + i << std::endl;
	}
	
	
	return 0;
}

输出结果为: (结果不唯一)

        在上面的程序中,使用不同的指针ptr来显示数组元素arr的地址。但是,数组元素可以通过使用相同的数组名arr来使用指针表示法来访问。例如:

int arr[3];

&arr[0] 等同于 arr
&arr[1] 等同于 arr + 1
&arr[2] 等同于 arr + 2

代码如下: 


#include <iostream>

int main() {
	int arr[3];
	std::cout << "&arr[0]的值为:"<< &arr[0] << std::endl;
	std::cout << "arr的值为:" << arr << std::endl;
	std::cout << "&arr[1]的值为:" << &arr[1] << std::endl;
	std::cout << "arr+1的值为:" << arr +1 << std::endl;
	return 0;
}

         运行上述程序,得到结果如下(结果不唯一,这是因为每次运行时给数组分配的地址不一样):

 

示例2:指针和数组

C ++程序使用指针符号显示数组元素的地址。

#include <iostream>
using namespace std;

int main() {
    float arr[5];
    
    cout<<"使用指针符号显示地址: "<< endl;
    for (int i = 0; i < 5; ++i) {
        cout << arr + i <<endl;
    }

    return 0;
}

输出结果:(结果不唯一) 

        您知道,指针ptr保存地址,而表达式*ptr给出存储在地址中的值。类似地,可以使用*(ptr + 1)获取存储在指针ptr + 1中的值。

请考虑以下代码:

int ptr[5] = {3, 4, 5, 5, 3};
  • &ptr[0]等于ptr,*ptr等于ptr[0]

  • &ptr[1]等于ptr + 1,*(ptr + 1) 等于ptr[1]

  • &ptr[2]等于ptr + 2,*(ptr + 2)等于ptr[2]

  • &ptr[i]等于ptr + i ,*(ptr + i)等于ptr[i]

验证代码如下: 

#include <iostream>

int main() {
    int arr[5] = { 1,3,9,8,5 };
    int* ptr; // 定义一个int类型的指针变量ptr
    ptr = arr;
    std::cout << "arr[0]=" << arr[0] << std::endl;
    std::cout << "*ptr=" << *ptr << std::endl;
    std::cout << "arr[1]=" << arr[1] << std::endl;
    std::cout << "*(ptr+1)=" << *(ptr + 2) << std::endl;
    std::cout << "arr[2]=" << arr[2] << std::endl;
    std::cout << "*(ptr+2)=" << *(ptr + 2) << std::endl;
    return 0;
}

输出结果: 

 注意:*ptr+1 与 *(ptr+1) 是有区别的,区别如下:(假设ptr指向arr数组的地址)

*ptr+1 :ptr存放的内容是arr数组的地址,即arr数组中第一个元素的地址,*ptr存放的内容是arr数组中第一个元素的值,则*ptr+1表示在第一个元素的值的基础上加1。
*(ptr+1):同样,ptr存放的内容是arr数组的地址,即arr数组中第一个元素的地址,ptr+1存放的内容是arr数组中第二个元素的地址,则*(ptr+1)存放的是第二个元素的值。

验证代码如下:

#include <iostream>

int main() {
    int arr[5] = { 1,3,9,8,5 };
    int* ptr; // 定义一个int类型的指针变量ptr
    ptr = arr;
    std::cout << "arr[1]=" << arr[1] << std::endl;
    std::cout << "*(ptr+1)=" << *(ptr + 1) << std::endl;
    std::cout << "*ptr+1=" << *ptr + 1 << std::endl;
    return 0;
}

输出结果: 

        上述代码中, arr数组为一个可以存放5个int类型数据的一维数组,且5个元素分别为:1,3,9,8,5。
        我们定义了一个int类型的指针变量ptr,并且将arr数组的地址,即第一个元素的地址赋给ptr,则有*(ptr+1)存放的是arr数组中第二个元素3,而*ptr存放的是arr数组中第一个元素1,那么*ptr+1就为2。

示例3:C ++指针和数组

C ++程序,用于插入和显示使用指针符号输入的数据。

#include <iostream>
using namespace std;

int main() {
    float arr[5];

    // 使用指针符号插入数据
    cout << "输入5个数字: ";
    for (int i = 0; i < 5; i++) {
        cin >> *(arr + i);
    }

    // 使用指针符号显示数据
    cout << "显示数据: " << endl;
    for (int i = 0; i < 5; i++) {
        cout << *(arr + i) << endl;
    }

    return 0;
}

输出结果: 

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

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

相关文章

关于JDK于JRE路径配置问题

今天在配置tomcat时发现&#xff0c;无法找到jre的路径&#xff0c;在网上找了半天&#xff0c;才知道&#xff0c;JDK11版本之后&#xff0c;jre的路径默认和JDK路径一致&#xff0c;JDK11之后的文件夹中不再包含jre文件夹&#xff0c;由此在配置JRE环境变量时&#xff0c;只需…

194、SpringBoot --- 下载和安装 Erlang 、 RabbitMQ

本节要点&#xff1a; 一些命令&#xff1a; 小黑窗输入&#xff1a; rabbitmq-plugins enable rabbitmq_management 启动控制台插件 rabbitmq-server 启动rabbitMQ服务器 管理员启动小黑窗&#xff1a; rabbitmq-service install 添加rabbitMQ为本地服务 启动浏览器访问 htt…

【微信小程序开发】一文学会使用CSS样式布局与美化

引言 在微信小程序开发中&#xff0c;CSS样式布局和美化是非常重要的一部分&#xff0c;它能够为小程序增添美感&#xff0c;提升用户体验。本文将介绍如何学习使用CSS进行样式布局和美化&#xff0c;同时给出代码示例&#xff0c;帮助开发者更好地掌握这一技巧。 一、CSS样式布…

基于虚拟同步发电机的光伏混合储能并网系统Simulink仿真

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【算法刷题】【反转链表】给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

题目 解决&#xff1a; import java.util.*;/** public class ListNode {* int val;* ListNode next null;* public ListNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#x…

Python 绘制玫瑰花

首先需要下载 matplotlib 模块 代码源码 from matplotlib import cm import matplotlib.pyplot as plt import numpy as npfig plt.figure() ax fig.add_subplot(projection3d) [x, t] np.meshgrid(np.array(range(25)) / 24.0, np.arange(0, 575.5, 0.5) / 575 * 17 * n…

【运筹学】整数规划建模技巧

在整数规划建模中&#xff0c;经常会使用到0-1变量来辅助建模&#xff0c;将模型表述为IP模型或BIP模型&#xff0c;下面是一些常见的整数规划建模技巧 使用辅助0-1变量实现“非此即彼”约束 如下图所示&#xff0c;有两条约束&#xff0c;希望只有其中一条起到约束的作用&am…

CVE-2023-4120:百卓智能Smart多业务安全网关智能管理平台SQL注入漏洞复现

文章目录 百卓智能Smart多业务安全网关智能管理平台SQL注入CVE-2023-4120 复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 百卓智能Smart多业务安全网关智能管理平台SQL注入CVE-2023-4120 复现 0x01 前言 免…

漏刻有时物联网环境态势感知大数据(设备列表、动态折线图)

物联网环境下的态势感知是指对物联网环境中的各种要素进行全面、实时、准确的监测、分析和预测,以实现网络态势的全面掌握和安全威胁的及时响应和处理。具体而言,态势感知以物联网环境为基础,利用各类传感器、数据采集设备和其他相关工具,对物联网设备、资产、数据流等进行…

Windows批处理

目录 echo off&#xff1a;关闭命令的回显功能&#xff0c;这样在执行脚本时不会显示每条命令的具体执行过程。建议将此行放在批处理脚本的首行。 rem&#xff1a;用于添加注释&#xff0c;后面可以跟上注释内容。注释的作用是对脚本进行说明或提醒&#xff0c;不会被执行。 …

大数据软件项目的应用行业

大数据软件项目可以应用于各种不同的行业&#xff0c;以帮助组织更好地理解和利用其数据资产&#xff0c;从而做出更明智的决策、提高效率并推动创新。以下是一些主要行业&#xff0c;大数据软件项目可以发挥重要作用的示例&#xff0c;希望对大家有所帮助。北京木奇移动技术有…

BaseQuickAdapter触底刷新实现

触底刷新实现 使用BaseQuickAdapter&#xff0c;在适配器中实现 LoadMoreModule即可&#xff0c;如下加上即可&#xff0c;无需多写代码 以下为分页实现&#xff1a; 视图中 // 获取加载更多模块loadMoreModule blogAdapter.getLoadMoreModule();loadMoreModule.setOnLoadMo…

滴滴出行回归:应对监管风暴,放眼全球增长

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;在遭遇监管挫折和市场份额下降后&#xff0c;滴滴出行正在恢复增长势头。 &#xff08;2&#xff09;尽管竞争激烈&#xff0c;但凭借强大的品牌和先进的技术&#xff0c;滴滴出…

如何精细化管理嵌入式软件项目?ACT汽车电子与软件技术周演讲回顾

2023 ACT汽车电子与软件技术周已于8月18日在中国上海落下帷幕。展会现场&#xff0c;龙智技术支持部负责人、Atlassian认证专家叶燕秀与龙智技术工程师邱洁玉共同为观众带来了主题为“更好、更快、更安全&#xff1a;嵌入式开发中的最佳实践与工具链构建”的演讲&#xff0c;分…

无代码集成API服务平台连接更多应用

场景描述&#xff1a; 基于API服务平台的开放能力&#xff0c;无代码集成API服务平台连接多个应用。通过Aboter搭建业务自动化流程&#xff0c;实现多个应用的数据集成。 常用接口能力&#xff1a; 生活服务交通地理金融商业企业管理开发技术快递物流实名核验网络通讯… 常…

虹科干货 | 不是吧,Redis Enterprise也能当向量数据库来用?

什么是向量相似性搜索啊&#xff1f; 例如&#xff0c;你需要搜索一棵发财树的图片&#xff0c;如果用传统数据库来检索&#xff0c;你大概率会在茫茫树丛中错失心仪的发财树。但是&#xff0c;向量相似性搜索能用向量来表示所有树的特征&#xff0c;这样就能够通过计算向量之间…

漏刻有时数据可视化大屏引导页设计2(偏移卡片、动态数字翻牌、countUp.min.js)

引入外部文件 <title>漏刻有时引导页</title><script src="js/jquery-3.3.1.min.js"></script><script src="js/countUp.min.js"></script><link rel="stylesheet" href="css/common.css">…

怎么查看电脑配置?只需三招,让你轻松get!

电脑配置对于了解计算机的性能和功能至关重要。无论是为了升级硬件、解决问题还是购买新电脑&#xff0c;查看电脑配置都是必不可少的。那你知道怎么查看电脑配置吗&#xff1f;本文将介绍3种查看电脑配置的方法&#xff0c;从而让您轻松获取所需信息。 方法1&#xff1a;使用W…

ARM汇编学习录 1 -基础概念

指令集概述 现阶段有四个不同的指令集 名称概述ARM3232位指令集Thumb16位指令集,ARM32子集,提供高密度低功耗Thumb232位指令集,ARMv6T2 引入.是thumb超集ARM6464位指令集 note&#xff1a; ARM某一个时刻只能运行单独ARM指令集或者Thumb指令,通过CPSR的T标志位决定. 如何当前…

论文笔记 A theory of learning from different domains

domain adaptation 领域理论方向的重要论文. 这篇笔记主要是推导文章中的定理, 还有分析定理的直观解释. 笔记中的章节号与论文中的保持一致. 1. Introduction domain adaptation 的设定介绍: 有两个域, source domain 与 target domain. source domain: 一组从 source dist.…