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

news2024/11/18 2:38:14

指针的定义

  • 在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;
    }
    

    在这里插入图片描述

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

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

相关文章

分享一个 git stash 的实际使用场景。

当我将新的变更记录提交为 git commit --amend 后&#xff0c;发现这需要修改云端上的提交记录&#xff0c;也就是 vscode 中会出现这张图 于是&#xff0c;我通过 git reset head^ 撤销掉刚刚的提交。 reset 前&#xff1a; reset 后&#xff1a; 但在撤销的同时&#xf…

华院计算参编《金融业人工智能平台技术要求》标准

随着人工智能技术的迅猛发展&#xff0c;金融机构正在从业务场景化向企业智能化演进&#xff0c;金融业对智能化的需求愈加迫切。为引导产业有序发展、规范行业自律、加快金融行业智能化转型&#xff0c;中国信通院依托中国人工智能产业发展联盟&#xff08;AIIA&#xff09;及…

机器学习 | 使用Scikit-Learn实现分层抽样

在本文中&#xff0c;我们将学习如何使用Scikit-Learn实现分层抽样。 什么是分层抽样&#xff1f; 分层抽样是一种抽样方法&#xff0c;首先将总体的单位按某种特征分为若干次级总体&#xff08;层&#xff09;&#xff0c;然后再从每一层内进行单纯随机抽样&#xff0c;组成…

第19讲:自定义类型:结构体

1.结构体类型的声明 2.结构体变量的创建和初始化 3.结构体变量的赋值 4.结构体成员访问操作符 5.结构体内存对齐 1.结构体类型的声明 1.1结构体声明 struct 结构体名称 { 结构体成员... } 举例&#xff1a;描述一个学生&#xff1a; 2结构体变量的创建和初始化 2.1匿…

Linux文本编辑器vim使用和分析—2

目录 1.对vim的简单理解&#xff1a; 2.看待vim的视角&#xff1a; 3.命令模式&#xff1a; 3.1vim被打开后默认的模式&#xff1a; 3.2命令模式切换插入模式&#xff1a; 3.3其他模式回到命令模式&#xff1a; 3.4光标定位&#xff1a; 4.插入模式(编辑模式)&#xff1…

数字乡村创新实践探索农业现代化与农村治理现代化新路径:科技赋能农村全面振兴与农民幸福生活

目录 引言 一、数字乡村与农业现代化 1、智慧农业技术的应用 2、农业产业链的数字化转型 二、数字乡村与农村治理现代化 1、农村信息化水平的提升 2、农村治理模式的创新 三、科技赋能农村全面振兴与农民幸福生活 1、提升农业生产效益与农民收入 2、促进农村产业结构…

【ArcGIS 脚本工具】在ArcPro中实现mdb转gdb

ArcGIS Pro作为主力使用很久了&#xff0c;但是ArcMap也从来没有卸载过。 要问为什么&#xff0c;就是还需要ArcMap来读写mdb数据库&#xff0c;Pro是不支持读写mdb数据库的。 我之前尝试过不借助ArcMap把mdb转成gdb&#xff0c;奈何技术太菜搞不定。 直到我看到了公众号【G…

人工智能轨道交通行业周刊-第77期(2024.4.1-4.14)

本期关键词&#xff1a;货车巡检机器人、铁路安全技防、车辆换长、阿里千问、大模型创业 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界…

现代电商会员管理新玩法——付费会员

现在&#xff0c;无论是线上还是线下&#xff0c;几乎都在做会员管理。会员规则五花八门&#xff0c;不仅有常见的注册会员&#xff0c;还出现了付费会员。付费会员机制&#xff0c;从成为会员的第一步就开始筛选&#xff0c;选出粘性高、要求高、复购高且有一定消费力的用户群…

缓存与数据库的数据一致性解决方案分析

在现代应用中&#xff0c;缓存技术的使用广泛且至关重要&#xff0c;主要是为了提高数据访问速度和优化系统整体性能。缓存通过在内存或更快速的存储系统中存储经常访问的数据副本&#xff0c;使得数据检索变得迅速&#xff0c;从而避免了每次请求都需要从较慢的主存储&#xf…

labview中的同步定时结构

单帧定时循环定时比较精确&#xff0c;最常用的功能还是它的定时循环功能&#xff0c;定时循环允许不连接“循环条件”端子&#xff0c;可以连接定时循环“结构名称”端子&#xff0c;通过定时结构停止函数停止循环。 例子在附件中。

MySQL workbench使用教程(逐渐补充版)

附件&#xff1a; 附1&#xff1a;MySQL下载、安装、配置之Windows 附2&#xff1a;MySQL workbench下载、安装、配置、汉化教程 一、 使用 Workbench 操作数据库 1.MySQL Workbench 初始化界面 2.连接远程 MySQL 数据库 3.创建数据库 切换至schemas标签&#xff0c;右键单…

在家如何查找下载外文文献

查找下载外文文献的数据库大部分都需要使用权限的&#xff0c;那么我们如何在家进入这些数据库查找下载文献资源呢&#xff1f;请看本文的经验分享&#xff1a; 举例1、 一位同学的文献求助&#xff1a;Performance of financial hedging and earnings management under dive…

科研学习|科研软件——如何使用SmartPLS软件进行结构方程建模

SmartPLS是一种用于结构方程建模&#xff08;SEM&#xff09;的软件&#xff0c;它可以用于定量研究&#xff0c;尤其是在商业和社会科学领域中&#xff0c;如市场研究、管理研究、心理学研究等。 一、准备数据 在使用SmartPLS之前&#xff0c;您需要准备一个符合要求的数据集。…

【自研网关系列】请求服务模块和客户端模块实现

&#x1f308;Yu-Gateway&#xff1a;&#xff1a;基于 Netty 构建的自研 API 网关&#xff0c;采用 Java 原生实现&#xff0c;整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施&#xff0c;承载请求路由、安全控制、流量治理等…

EasyUI Jquery 学习笔记 ——DataGrid(数据网格)与 Tree(树)详细版

1. DataGrid(数据网格)与 Tree(树) 1.1 Datagrid 数据网格 扩展自 $.fn.panel.defaults。通过 $.fn.datagrid.defaults 重写默认的 defaults。 数据网格(datagrid)以表格格式显示数据,并为选择、排序、分组和编辑数据提供了丰富的支持。数据网格(datagrid)的设计目…

前端三件套学习笔记(持更)

目录 1、HTML,CSS,JS区别 2、HTML结构 1、HTML,CSS,JS区别 结构写到 HTML 文件中&#xff0c; 表现写到 CSS 文件中&#xff0c; 行为写到 JavaScript文件中。 2、HTML结构 <!DOCTYPE html> <html><head><title>我的第一个页面</title><…

[尚硅谷flink] 检查点笔记

在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 文章目录 11.1 检查点11.1.1 检查点的保存1&#xff09;周期性的触发保存2&#xff09;保存的时间点3&#xff09;保存的具体流程 11.1.2 从检查点恢复状态11.1.3 检查点算法…

计算机服务器中了rmallox勒索病毒怎么办,rmallox勒索病毒解密流程步骤

在企业的生产运营过程中网络发挥着巨大作用&#xff0c;利用网络可以拓宽市场&#xff0c;提高办公效率&#xff0c;网络为企业的生产运营提供了极大便利&#xff0c;但也为企业的数据安全带来隐患。近日&#xff0c;云天数据恢复中心接到多家企业的求助&#xff0c;企业的计算…

二维相位解包理论算法和软件【全文翻译- 菲林(Flynn)最小不连续性方法(4.5)】

4.5 菲林最小不连续性方法 在迄今为止对路径跟踪算法的讨论中,我们忽略了一种非常自然的方法,现在我们将对其进行描述。如果我们仔细观察图 4.42(a)中包裹相位数据中的条纹图案,就会发现 "条纹线 "或最亮像素和最暗像素之间的边界标志着从 0 到 2π 的过渡,它们…