C/C++基础----指针

指针的定义

  • 在c/c++中,有一个特殊的变量指向我们电脑中某个内存地址,进而可以让我们操作这段内存,指的就是指针类型

  • 语法:

    int a = 10;
    int* p = &a;
    
  • &符号是取出某个变量的内存地址

  • 把这个内存地址赋值给一个变量p,而接收我们内存地址的变量类型就为 类型* 指针类型

  • 因为a的类型为int,所以a的指针类型为int*

  • *p是取出该地址的值

    #include <iostream>
    
    using namespace std;
    
    int main() {
        int a = 10;
        int *p = &a;
        cout << "a的值:" << a << endl;
        cout << "a的内存地址:" << p << endl;
        cout << "取指针p内存地址的值:" << *p << endl;
        return 0;
    }
    

    在这里插入图片描述

  • 通过指针操作a的值

    // 通过*p修改a的值
    *p = 58;
    cout << "修改后的a的值:" << a << endl;
    

    在这里插入图片描述


指针数组

原生数组中的地址

  • 可以看到数组中元素的地址是连续的,因为int为四个字节,所以每次地址都加4

    #include <iostream>
    
    using namespace std;
    
    int main() {
        int a[] = {1, 2, 3, 4, 5};
        //	循环取址
        for (int &i: a) {
            cout << &i << endl;
        }
        return 0;
    }
    

    在这里插入图片描述

  • 直接打印数组的内存地址和数组内第一个元素的内存地址是一样的

    cout << "直接打印数组的地址:" << &a << endl;
    cout << "打印数组第一个元素的地址:" << &a[0] << endl;
    

    在这里插入图片描述

创建存放指针的数组

  • 语法:
    int* a[指针数组的大小];
    
  • 使用指针数组操作数组
    #include <iostream>
    
    using namespace std;
    
    int main() {
        int a[] = {1, 2, 3, 4, 5};
        int *p_a[5];
        for (int i = 0; i < 5; i++) {
            p_a[i] = &a[i];
        }
        for (int *i: p_a) {
            cout << i << endl;
            cout << *i << endl;
        }
        for (int *i: p_a) {
            *i = 1516;
        }
        cout << "=======" << endl;
        for (int *i: p_a) {
            cout << *i << endl;
        }
        return 0;
    }
    
    在这里插入图片描述

多级指针

  • 指针也是一个变量,变量都有地址,所以指针类型也有他的地址

  • 其实某个变量的指针就是把该变量十六进制的内存地址存放到了指针类型的变量里

  • 直接打印a变量的地址和打印a变量的指针内容是一样的

    #include <iostream>
    
    using namespace std;
    
    int main() {
        int a = 20;
        cout << &a << endl;
        int *p_a = &a;
        cout << p_a << endl;
        return 0;
    }
    

    在这里插入图片描述

  • 所以指针可以有多级

    • 这里其实是p_a指针指向了a的内存地址,pp_a指向了指针p_a的内存地址,ppp_a指向了pp_a的内存地址,所以取值的时候三次*可以取出来a的值。
    #include <iostream>
    
    using namespace std;
    
    int main() {
        int a = 20;
        int *p_a = &a;
        int **pp_a = &p_a;
        int ***ppp_a = &pp_a;
        cout << ***ppp_a << endl;
        return 0;
    }
    

    在这里插入图片描述


指针类型占用的字节

  • 前面说了指针的内容就是一个十六进制的内存地址,所以为数字,我们打印指针类型的大小为8个字节,所有的指针类型都为8个字节

    #include <iostream>
    
    using namespace std;
    
    int main() {
        int a = 20;
        int *p_a = &a;
        char b = 'a';
        char *p_b = &b;
        cout << sizeof p_a << endl;
        cout << sizeof p_b << endl;
        return 0;
    }
    

    在这里插入图片描述


指针的加减

  • 指针的加减随指针类型改变,例如int为4个字节,int *类型的指针+1就是+4个字节,long long类型为8个字节,long long*类型的指针+1就为+8个字节

    #include <iostream>
    
    using namespace std;
    
    int main() {
        int a = 20;
        int *p_a = &a;
        long long c = 10;
        long long*p_c = &c;
        cout << "int *类型的加1" << endl;
        cout << p_a << endl;
        cout << p_a + 1 << endl;
        cout << p_a + 2 << endl;
        cout << "long *类型的加1" << endl;
        cout << p_c << endl;
        cout << p_c + 1 << endl;
        cout << p_c + 2 << endl;
        return 0;
    }
    

    在这里插入图片描述

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

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

相关文章

数据适配器对象(DataAdapter)

一、DataAdapter对象概述 1、 DataAdapter是一个特殊的类&#xff0c;其作用是数据源与DataSet对象之间沟通的桥梁。 2、 DataAdapter提供了双向的数据传输机制 &#xff08;1&#xff09; 在数据源上执行Select语句&#xff0c;把查询结果集传送到DataSet对象的…

基于Spring Boot的入职匹配推荐系统设计与实现

基于Spring Boot的入职匹配推荐系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 管理员登录界面&#xff0c;登录成功后进入到系统操…

STC89C52学习笔记(九)

STC89C52学习笔记&#xff08;九&#xff09; 综述&#xff1a;本文主要介绍了蜂鸣器、蜂鸣器如何使用以及如何利用蜂鸣器播放不同频率声音。 一、蜂鸣器 1.定义和作用 电信号→声音信号&#xff0c;常用来产生按键音和报警音。 2.分类 有源&#xff1a;自带振荡器&#…

设计模式面试题

概述 设计模式分类 创建型模式 用于描述“怎样创建对象”&#xff0c;主要特点是“将对象的创建与使用分离”。使用者不需要官族对象创建的细节。结构型模式 用于描述如何将类或对象按照某种布局组成更大的结构。行为型模式 用于描述类或对象之间怎样相互协作共同完成单个对象…

面试经典150题——二叉树的最大深度

1. 题目描述 ​ 2. 题目分析与解析 这个题目有过一定基础的都应该知道&#xff0c;采用递归解决问题&#xff0c;因为要求一个二叉树的深度&#xff08;也就是高度&#xff09;&#xff0c;其实上就是根节点的左子树和右子树中高度最高的那个。因此这个问题就可以拆解为&…

微服务之OpenFeign服务接口调用

一、概述 1.1简介 OpenFeign客户端是一个web声明式http远程调用工具&#xff0c;直接可以根据服务名称去注册中心拿到指定的服务IP集合&#xff0c;提供了接口和注解方式进行调用&#xff0c;内嵌集成了Ribbon本地负载均衡器。 Feign是一个声明性web服务客户端。它使编写web服…

BackTrader 中文文档(二十三)

原文&#xff1a;www.backtrader.com/ 基准测试 原文&#xff1a;www.backtrader.com/blog/posts/2016-07-22-benchmarking/benchmarking/ backtrader包括两种不同类型的对象&#xff0c;可以帮助跟踪&#xff1a; 观察者 分析器 问题 #89是关于添加针对资产的基准测试。这是…

[阅读笔记12][LLaVA-1.5]Improved Baselines with Visual Instruction Tuning

1.5版本是llava作者在23年10月提交的。 作者对原始的llava进行了四个很小的改进&#xff0c;之后就刷了11个数据集的sota。而且可以看到llava用于训练的数据量很小&#xff0c;与instructBLIP和通义千问比少多了。 然后这里就是llava1.5进行的四个小改进。 第一点是prompt明确短…

【Excel如何在表格中筛选重复的值之条件格式】

在使用excel进行统计时经常会遇到&#xff0c;数据统计出现重复的现象&#xff0c;为了确保数据的唯一性&#xff0c;可以用到条件格式筛选出重复值&#xff0c;以确保数据的正确性。 筛选重复值&#xff1a; 选中要筛选的范围&#xff0c;行或列或整个表选中【开始】-【条件…

vue快速入门(二十三)侦听器的简单写法与完整写法

注释很详细&#xff0c;直接上代码 上一篇 新增内容 侦听器简单写法侦听对象或属性侦听器完整写法侦听对象&#xff08;可选深度侦听&#xff09; 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name…

Zookeeper(从入门到掌握)看完这一篇就够了

文章目录 一、初识 Zookeeper1.Zookeeper 概念2.Zookeeper 数据模型3.Zookeeper 服务端常用命令4.Zookeeper 客户端常用命令 二、ZooKeeper JavaAPI 操作1.Curator 介绍1.Curator API 常用操作&#xff08;1&#xff09;建立连接&#xff08;2&#xff09;添加节点&#xff08;…

C#版Facefusion ,换脸器和增强器

C#版Facefusion &#xff0c;换脸器和增强器 目录 说明 效果 项目 调用代码 说明 Facefusion是一款最新的开源AI视频/图片换脸项目。是原来ROOP的项目的延续。项目官方介绍只有一句话&#xff0c;下一代换脸器和增强器。 代码实现参考 https://github.com/facefusion/f…

AI天使汇联合150家顶级基金、战投,征集优秀AI创业项目

鉴于AI天使汇主办的2024年3月期优秀项目征集活动效果超出预期&#xff0c;3月活动最后TOP20路演者中已有多家快速拿到了TS。 路演活动质量受到了AI创业公司和基金/战投伙伴的高度评价&#xff0c;现在开始四月期活动报名! 本期征集活动联合的顶级基金和战投数量增加到了150家…

Shell脚本学习(一):Shell内置命令与Shell运算符

Shell内置命令 理解内置命令的含义。 内置命令介绍 Shell内置命令&#xff0c;就是由Bash Shell自身提供的命令&#xff0c;而不是文件系统中的可执行文件。 使用type 可以用来确定一个命令是否是内置命令&#xff1a; type 命令演示&#xff1a; 对于上述演示的两个命令来…

【我的代码生成器】生成React页面类

有了数据表的结构信息&#xff0c;就能生成React 的页面类&#xff0c;快捷方便。 生成界面如下&#xff1a; 生成的React FrmUser.js页面如下&#xff1a; 只需再写里面的操作逻辑代码。

链表创建的陷阱与细节

链表是线性表的一种&#xff0c;它在逻辑结构上是连续的&#xff0c;在物理结构上是非连续的。 也就是说链表在物理空间上是独立的&#xff0c;可能是东一块西一块的。如下顺序表和链表在内存空间上的对比&#xff1a; 而链表的每一块空间是如何产生联系实现在逻辑结构上是连续…

关于java中的线程池用法

目录 线程池的参数介绍 线程池的工作流程 使用Executors创建常见的线程池 池的思想&#xff0c;在计算机中是非常普遍的概念。顾名思义&#xff0c;池是将一个或多个任务提前创建好&#xff0c;放入容器中&#xff0c;当程序运行的时候直接取出使用&#xff0c;这个容器就叫…

Imagination APXM-6200 CPU:性能卓越,安全可信

随着消费类和工业应用行业的不断发展&#xff0c;对创新性能和效率的需求永不停歇&#xff0c;我们自豪地推出旗下 Catapult CPU 系列的第二款产品&#xff1a;Imagination APXM-6200 CPU 。这款 64 位的高效 RISC-V 应用处理器具有强大的 AI 功能及性能密度&#xff0c;能够为…

基于Java+SpringBoot3+vue3健身房管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

使用openLayers报错Module parse failed: Unexpected token

引入OpenLayers时报错 JavaScript模块解析失败 在构建工具中配置 transpileDependencies 参数&#xff0c;因为 ol 依赖库基于一个目标环境不支持的 ES 版本撰写&#xff0c;将该依赖添加进 vue.config.js 中的 transpileDependencies 选项中 // including the package "…