C++ 复合数据类型:指针

文章目录

  • 指针
    • 用法
    • 无效指针
    • 空指针
    • void *ptr
    • 指向指针的指针
    • 指向常量的指针
    • 指针常量
    • 指针和数组
      • 指针数组和数组指针

指针

计算机中的数据都存在内存中,访问内存的最小单元是“字节”,所有数据,就保存在内存中具有连续编号的一串字节中。
在这里插入图片描述
指针顾名思义就是指向另一种数据类型的复合类型。指针是C/C++中保存另一个数据对象在内存中的“地址”。通过指针可以访问到指向的那个数据对象,所以这是一种间接访问对象的方法。
指针的定义语法形式:类型* 指针变量;
类型是指针指向的对象的类型。
例如:以下 int 类型占4个字节,char占1个字节,指针占8个字节,指针里存的是a的地址:
00 00 00 34 F7 EF F8 88
在这里插入图片描述

#include<iostream>

using namespace std;

int main()
{
    //定义指针
    int *p1;
    long *p2;
    long long *p3;

    cout << "p1长度:" << sizeof(p1) << endl;
    cout << "p2长度:" << sizeof(p2) << endl;
    cout << "p3长度" << sizeof(p3) << endl;
    //指针存放的都是地址,因此它的长度只与系统有关,而不是与类型有关
    //此处输出都是8

}

用法

//指针的使用
int a = 10;
int b = 20;
long c = 88;

p1 = &a; //p1指针指向a
p2 = &c;
cout << "p1:" << p1 << endl;
cout << "p2:" << p2 << endl;

//如何通过指针获取内容
cout << "*p1:" << *p1 << endl;  //*p1:10
cout << "*p2:" << *p2 << endl;  //*p2:88
*p1 = 33;
cout << "a:" << a << "\t*p1:" << *p1 << endl;  //a:33    *p1:33

无效指针

定义一个指针后,如果不进行初始化,指针的内容就是不确定的。如果这时把它的内容当成一个地址去访问,那访问的是不存在的对象;如果访问到的是系统核心区域,修改其中的内容就有可能导致系统崩溃。这样的指针就是“无效指针”,也被叫做“野指针”。

int *p1;
//*p1 = 100   //直接解引用,危险!指针没有初始化,是无效指针

空指针

如果先定义了一个指针,但不确定它要指向哪一个对象,可以先初始化为“空指针”。空指针不指向任何对象。

//空指针
int *np = nullptr;  //空指针的字面值常量,推荐使用
np = NULL;  //预处理变量
np = 0; //只有0可以初始化,让其指向一个未被使用的内存

int zero = 0;
//np = zero  //该初始化行不通

void *ptr

// void *ptr
int a = 10;
char b = 'c';
long d = 67.2;

int *p1 = &a; //p1只能指向int类型

//想要一个能指向任意类型的指针
void *ptr;
ptr = &a;
ptr = &b;
ptr = &c;

// cout << *ptr << endl; //错误,void类型指针只能用来存储地址,但是不能解引用


指向指针的指针

也叫“二级指针”,用连续两个“*” 表示,如果是三级指针则用三个表示。
在这里插入图片描述

    // 指向指针的指针
    int i = 22;
    int *p5 = &i;
    int **pp5 = &p5;

    cout << "i:\t" << i << endl;
    cout << "p5:\t" << p5 << endl;
    cout << "pp5:\t" << pp5 << endl;
    cout << "*p5:\t" << *p5 << endl;
    cout << "*pp5:\t" << *pp5 << endl;
    cout << "**pp5:\t" << **pp5 << endl;

/*输出
i:      22
p5:     0x61fdc8
pp5:    0x61fdc0
*p5:    22
*pp5:   0x61fdc8
**pp5:  22
*/

指向常量的指针

//指向常量的指针
const int i = 10, j = 20;
const int *p = &i;
cout << "p\t" << p << endl;
cout << "*p\t" << *p << endl;
//*p = 15 //错误,常量不可修改
p = &j;  //但是指针指向的对象可以换
cout << "*p\t" << *p << endl;

指针常量

int x = 10; 
int y = 20; 
int *const ptr = &x; // 定义一个指向整型变量的指针常量,指向 x

cout << "x 的值为:" << x << endl;
cout << "通过指针访问 x 的值:" << *ptr << endl;

// 尝试修改指针指向的地址
// ptr = &y; // 这行代码会导致编译错误,因为 ptr 是一个指针常量,不能再指向其他地址

// 通过指针修改所指向地址的内容
*ptr = 100;
cout << "修改后,x 的值为:" << x << endl;

指针和数组

用到数组名时,编译器一般都会把它转换为指针,这个指针就指向数组第一个元素。所以也可以用数组名给指针赋值

//指针和数组的关系
int arr[5] = {1, 2, 4, 5, 6};
cout << "&arr\t" << &arr << endl;
cout << "arr\t" << arr << endl;
cout << "&arr[0]\t" << &arr[0] << endl;
cout << "arr+1\t" << arr + 1 << endl; // arr+1 相当于是arr[1]的地址
cout << "&arr[1]\t" << &arr[1] << endl;

int *ptr = arr;
cout << "ptr\t" << ptr << endl;
cout << "*ptr\t" << *ptr << endl;
cout << "ptr+1\t" << ptr + 1 << endl;
cout << "*(ptr + 1)\t" << *(ptr + 1) << endl;
   
输出:
&arr    0x61fe00
arr     0x61fe00
&arr[0] 0x61fe00
arr+1   0x61fe04
&arr[1] 0x61fe04
ptr     0x61fe00
*ptr    1
ptr+1   0x61fe04
*(ptr + 1)      2

指针数组和数组指针

int arr[5] = {1, 2, 3, 4, 6};
//指针数组,本质是数组,数组的所有的元素都是同类型的指针
int *pa[5]; 
cout << "sizeof(pa)\t" << sizeof(pa) << endl;
pa[0] = arr;
pa[1] = arr +1;
cout << "pa[0]\t" << pa[0] << endl;
cout << "*pa[0]\t" << *pa[0] << endl;

输出
sizeof(pa)      40
pa[0]   0x61fe00
*pa[0]  1

//数组指针,本质是指针,指向一个数组 
int (*ap)[5] = &arr;
cout << "sizeof(ap)\t" << sizeof(ap) << endl;
cout << "ap\t" << ap << endl;
cout << "*ap\t" << *ap << endl;
cout << "**ap\t" << **ap << endl;
cout << "*(*ap + 1)\t" << *(*ap + 1) << endl;

输出:
sizeof(ap)      8
ap      0x61fe00
*ap     0x61fe00
**ap    1
*(*ap + 1)      2

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python三大开发框架django、 flask 和 fastapi 对比

本文讲述了什么启发了 FastAPI 的诞生&#xff0c;它与其他替代框架的对比&#xff0c;以及从中汲取的经验。 如果不是基于前人的成果&#xff0c;FastAPI 将不会存在。在 FastAPI 之前&#xff0c;前人已经创建了许多工具 。 几年来&#xff0c;我一直在避免创建新框架。首先&…

竞赛保研 基于LSTM的天气预测 - 时间序列预测

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 机器学习大数据分析项目 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/po…

Python深度学习029:pytorch中常用的模块或方法

PyTorch是一个广泛使用的深度学习库,提供了许多用于构建和训练神经网络的模块和方法。下面是一些PyTorch中常用的模块和方法的简要介绍: PyTorch常用模块和方法 torch 用途:PyTorch的基础模块,提供了多种数学运算功能。常用方法: torch.tensor():创建张量torch.randn():…

使用for语句换行打印久久乘法表格

一、基本思想 思想来源于九九乘法表&#xff0c;使用*来表示乘法并进行乘法的运算&#xff0c;最大的思想就是双层for循环&#xff0c;最关键的思想是进行里面的第二次for循环时&#xff0c;第二次索引的变量要小于等于第一次索引的变量。 二、 相关代码 public class Jiujiu…

IntelliJ IDEA 2023.3 安装教程

引言 IntelliJ IDEA&#xff0c;通常简称为 IDEA&#xff0c;是由 JetBrains 开发的一款强大的集成开发环境&#xff0c;专为提升开发者的生产力而设计。它支持多种编程语言&#xff0c;包括 Java、Kotlin、Scala 和其他 JVM 语言&#xff0c;同时也为前端开发和移动应用开发提…

实战:使用 OpenCV 和 PyTesseract 对文档进行 OCR

随着世界各地的组织都希望将其运营数字化&#xff0c;将物理文档转换为数字格式是非常常见的。这通常通过光学字符识别 (OCR) 完成&#xff0c;其中文本图像&#xff08;扫描的物理文档&#xff09;通过几种成熟的文本识别算法之一转换为机器文本。当在干净的背景下处理打印文本…

BUUCTF-Crypto合集-WP

获取CTF工具可关注CSJH网络安全团队&#xff0c;回复CTF工具 一眼就解密 下面的字符串解密后便能获得flag&#xff1a;ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30 注意&#xff1a;得到的 flag 请包上 flag{} 提交 大小写字母加数字&#xff0c;而且等于号结尾&#xff0c;bas…

最新技术整理3款开源免费直播推流工具,实现实时视频推流、视频拉流,目标端可以是服务器、云平台、移动设备等(附源码)

最新技术整理3款开源免费直播推流工具&#xff0c;实现实时视频推流、视频拉流&#xff0c;目标端可以是服务器、云平台、移动设备等&#xff08;附源码&#xff09;。 什么是推流&#xff1f; 视频推流是指将实时的视频数据从一个源端发送到一个或多个目标端的过程。推流的源…

HTTP前端请求

目录 HTTP 请求1.请求组成2.请求方式与数据格式get 请求示例post 请求示例json 请求示例multipart 请求示例数据格式小结 3.表单3.1.作用与语法3.2.常见的表单项 4.session 原理5.jwt 原理 HTTP 请求 1.请求组成 请求由三部分组成 请求行请求头请求体 可以用 telnet 程序测…

基于Java+Swing实现大鱼吃小鱼小游戏(含用户登陆、注册功能)

基于JavaSwing实现大鱼吃小鱼小游戏 一、系统实现二、功能展示1.效果演示2.游戏界面3.游戏运行界面4.用户登陆 三、其他系统四源码下载 一、系统实现 1、创建窗口对象Ui 2、背景的绘制 3、键盘的监听事件 4、将己方鱼放上去 5、让小鱼移动 6、其他的鱼并引导&#xff08;先创建…

MFC使用高速绘图控件high-speed Charting Control绘制柱形图

1. 创建MFC单文档工程BarChartDemo。 2. 在工程文件夹下新建文件夹ChartCtrl,将ChartCtrl源码放入,如下图所示。在工程中添加这些项,项目——添加——现有项,全部添加。 3. 添加一个对话框,ID为IDD_DLG_BAR,类名为CBarDlg。 4. 在对话框中添加Custom Control控件,将控…

Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection(CVPR2023待补)

文章目录 BeginningAbstract挑战方法成果 Introduction引出问题早期的work及存在的问题近期的work及存在的问题our workContribution Related Work&#xff08;paper for me&#xff09;Oriented Object DetectionPrior for Oriented ObjectsLabel Assignment Tiny Object Dete…

鸿蒙开发者工具安装及入门程序

下载工具DevEco Studio IDE 官网下载&#xff1a;HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 开发工具的安装 解压下载好的压缩包&#xff0c;一路无脑安装即可&#xff0c;安装完的使用方法类似于IDEA、WebStorm的使用&#xff0c;快捷键一致&#xff0c;默认黑…

【顶级快刊】IEEE(Trans),审稿快仅2个月录用,入选CCF-B,现在投最快!

计算机类 • 好刊解读 今天小编带来IEEE旗下计算机领域顶刊&#xff0c;顶级快刊&#xff0c;CCF-B类推荐&#xff0c;如您有投稿需求&#xff0c;可作为重点关注&#xff01;后文有相关领域真实发表案例&#xff0c;供您投稿参考~ 01 期刊简介 IEEE Transactions on Affect…

C++结合OpenCV:掌握图像基础与处理

本文详细介绍了使用 OpenCV4 进行图像处理的基础知识和操作。内容包括图像的基础概念、色彩空间理解、以及如何在 C 中进行图像读取、显示和基础操作。 1.图像的基本概念与术语 图像表示 在计算机视觉中&#xff0c;图像通常表示为一个二维或三维的数组。二维数组表示灰度图像&…

数据分析基础之《numpy(5)—合并与分割》

了解即可&#xff0c;用panads 一、作用 实现数据的切分和合并&#xff0c;将数据进行切分合并处理 二、合并 1、numpy.hstack 水平拼接 # hstack 水平拼接 a np.array((1,2,3)) b np.array((2,3,4)) np.hstack((a, b))a np.array([[1], [2], [3]]) b np.array([[2], […

python dash 的学习笔记1

dash 用python开发web界面 https://dash.plotly.com/ 官方上支持jula F# python一类。当然我只会python只学习python中使用dash. 要做一个APP&#xff0c;用php,java以及.net都可以写&#xff0c;只所有选择python是因为最近在用这一个。同时也发现python除了慢全是优点。 资料…

桶装水送水小程序:提升服务质量的利器

随着移动互联网的发展&#xff0c;越来越多的消费者通过手机在线购物和订购商品。如果你是一名桶装水供应商&#xff0c;想要拓展线上业务&#xff0c;那么开发一个桶装水微信小程序将是一个明智的选择。本文将指导你从零开始开发一个桶装水微信小程序&#xff0c;让你轻松完成…

Java开发框架和中间件面试题(3)

14.Spring事务中的隔离级别有哪几种&#xff1f; 在TransactionDefinition接口中定义了五个表示隔离级别的常量&#xff1a; 1⃣️ISOLATION DEFAULT&#xff1a;使用后端数据库默认的隔离级别&#xff0c;Mysql默认采用的可重复读隔离级别&#xff1b;Oracle默认采用的读已提…

Linux一行命令配置jdk环境

使用方法&#xff1a; 压缩包上传 到/opt, 更换命令中对应的jdk包名即可。 注意点&#xff1a;jdk-8u151-linux-x64.tar.gz 解压后名字是jdk1.8.0_151 sudo tar -zxvf jdk-8u151-linux-x64.tar.gz -C /opt && echo export JAVA_HOME/opt/jdk1.8.0_151 | sudo tee -a …