C++指针(坚持更新c++内容的第1天)

2023-11-06

概述

c/c++语言强大,效率高。很大的程度是体现在指针的灵活运用上面。即便是有经验的程序员使用指针也会因指针的错误而受折磨。本文参考各位大佬的资料来记录一下有关于指针的概念以及相关用法。

1. 什么是指针?

复合类型(compound type)是指基于其他类型定义的类型。C++语言有几种复合类型,比如引用和指针。引用(reference)为对象起了另外一个名字,通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名,值得注意的是,引用必须被初始化,程序把引用和它的初始值绑定(bind)在一起。除此之外,由于引用本身不是一个对象, 所以不能定义引用的引用。程序加载到内存中后,在程序中使用的变量、常量、函数等数据,都有自己唯一的一个编号,这个编号就是这个数据的地址。指针的值实际是内存单元的编号,所以指针单从数值看,也是整数,一般用16进制表示。指针就是程序数据的地址,指针变量是存这些地址的变量。

2. 指针对象 (变量)

用来保存指针的对象,就是指针对象。如果指针变量p1保存了变量a的地址,则说p1指向变量a。指针值应属于4种状态之一: 1. 指向一个对象。 2. 指向紧邻对象所占空间的下一个位置。3. 空指针,意味着指针没有指向任何对象。4.无效指针。其中,第2种状态主要用于迭代器和指针的计算。第3种状态空指针,其不指向任何对象,通常让指针变量赋值为NULL表示一个空指针。C++11标准引入的一种方法,用nullptr来初始化指针。第4种状态无效指针,未经过初始化的指针是无效指针,所以定义指针变量的时候一定要进行初始化(未经过初始化的指针是运行错误的一大原因)。

2.1 定义指针对象

定义指针变量时,在变量名前写一个*星号, 这个变量就变成了对应变量类型的指针变量。必要时要加()来避免优先级的问题。

int *p;  //定义指向int类型变量的指针

double *p; //定义指向double类型变量的指针

Student *student; //定义指向类或者结构体的指针

int **p; //定义指向整型变量指针的指针

int (*p)[3]; //定义指向3个整型元素数组的指针

int (*p)(int, int) //定义指向返回类型为int,有2个int形参的函数的指针

2.2 获取对象地址

指针用于存放某个对象的地址,想要获取该地址,需要使用取地址(&)。

double val;
double *p = &val;

int val;
int *p = &val;

# 数组名的值就是这个数组的第一个元素的地址
int arr[2] = {1, 2};
int *p = arr;

# 函数名的值就是这个函数的地址
int add(int a, int b)
{
   return a+b;
}

int (*p)(int, int) = add;

# 字符串常量作为右值时,就是这个字符串对应的字符数组的名称
const char *p = "hello world"

2.3 解析地址对象

如果指针指向了一个对象,用操作符*来访问该对象。

int age = 19;
int *p = &age;
*p = 22; //通过指针修改指向的内存数据

对于结构体和类,使用->符号访问内部成员。

2.4 赋值和指针

 有时候,想要搞清楚赋值语句到底是改变了指针的值还是改变了指针所指对象的值都不是很容易,最好的办法就是记住赋值永远改变的是等号左侧的对象。

# p的值被改变, 现在p指向了val
int age = 10;
int val = 20;
int *p = &age;
p = &val;

# val的值被改变, 指针p没有变
*p = 120;

指针间的赋值,指针赋值和int变量赋值一样,将地址的值拷贝给另外一个。

# 指针之间的赋值是一种浅拷贝
int *p1 = &a;
int *p2 = p1;

参考资料
《C++ primer 第五版》

C++指针详解 - ggjucheng - 博客园

C++指针详解_YoungYangD的博客-CSDN博客_c++指针

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++指针(坚持更新c++内容的第1天) 的相关文章

随机推荐

  • 操作系统作业 - 内存管理 - 请求分页分配方式模拟

    内存管理 请求分页分配方式 设计方案报告 文末有源码 文章目录 内存管理 请求分页分配方式 设计方案报告 1 项目需求 1 1 基本任务 1 2 功能描述 1 3 项目目的 2 开发环境 3 项目结构 4 操作说明 5 系统分析 5 1 置
  • 洛谷题单 算法1-7 搜索

    USACO08FEB Meteor Shower S 题目描述 Bessie hears that an extraordinary meteor shower is coming reports say that these meteor
  • 【千律】C++基础:宽窄字节字符串的相互转换与控制台输出

    方案1 include
  • 怎么调节手机的刷新率_二分钟科普:手机上的“高刷新率”

    上回粗略带过屏幕刷新率 这篇将会以更简单的叙述 介绍手机屏幕刷新率和插帧 本期关键词 屏幕刷新率 FPS 插帧 正文 不纠结这是谁带节奏 进步是必然的 屏幕刷新率 通常单位为Hz 是一个硬件固定数值 例如一部手机的屏幕刷新率为120Hz 那
  • Conditional DETR spatial attention & content attention可视化(二)

    就是将attention图通过加权叠加 叠加到原图上 要通过cv2 applyColorMap 将attention的单通道图转为三通道图 将attention中一些小的值置0 不然叠加之后会干扰原图 产生色差 至于蓝色 是通过cv2 ap
  • tcp retransmission 出现的原因_TCP 协议快被淘汰了,UDP 协议才是新世代的未来?

    公众号关注 运维之美 设为 星标 每天带你玩转 Linux TCP 协议可以说是今天互联网的基石 作为可靠的传输协议 在今天几乎所有的数据都会通过 TCP 协议传输 然而 TCP 在设计之初没有考虑到现今复杂的网络环境 当你在地铁上或者火车
  • 多线程:什么是同步与异步?二者的区别

    今天看到一道面试题 同步与异步有什么区别 同步 异步 这个在我们学习多线程的时候 会接触到这个概念 后面所学的一系列多线程知识运用也是以这两个点开展的 由于学习的时候囫囵吞枣 导致我对这两个概念没法准确说出定义及其区别 现在记录一下 如果光
  • 修改主机名(/etc/hostname和/etc/hosts区别)

    ubuntu永久修改主机名 1 查看主机名 在Ubuntu系统中 快速查看主机名有多种方法 其一 打开一个GNOME终端窗口 在命令提示符中可以看到主机名 主机名通常位于 符号后 其二 在终端窗口中输入命令 hostname或uname n
  • Visual Stdio 2017 Community 中文版哪里下载方便

    嫌官网不好用的话 推荐先下一个腾讯电脑管家 腾讯电脑管家自带了软件下载中心 可以去那里获取Visual Stdio 2017 Community 具体步骤如下 1 安装腾讯电脑管家 2 打开腾讯电脑管家 点击软件管理 如图 3 搜索Visu
  • 寻找环——指针法

    一 在一条链中找环 bool judge int a 存在返回ture 否则返回false int slow 0 fast 0 do slow a slow fast a a fast while slow fast a fast 1 if
  • 嵌入式数据库-SQLite3的基本指令及用C语言操作数据库

    SQLite简介 轻量化 易用的嵌入式数据库 用于设备端的数据管理 可以理解成单点的数据库 传统服务器型数据 库用于管理多端设备 更加复杂 SQLite是一个无服务器的数据库 是自包含的 这也称为嵌入式数据库 这意味着数据库引擎作为应用程序
  • DEMO:修改外向交货单BAPI_OUTB_DELIVERY_CHANGE_SAP刘梦_新浪博客

    简单demo 交货单数量 1 然后维护上序列号 有的公司没有启用序列号就不需要了 REPORT zdemo vl02n TABLES likp lips PARAMETERS p vbeln TYPE vbeln vl PARAMETER
  • 若依源码DataScopeAspect数据权限

    目录 源代码 使用场景 代码解析 源代码 从这里可以看出 表sys role dept 的用途 之前一起不清楚 role dept关联表的含义 自定义数据权限时 DATA SCOPE CUSTOM 通过角色 可以管理哪几个部门 来实现的 A
  • qt中的setStyleSheet的基本用法(按钮的几种状态)

    参考博客 https blog csdn net qq 42250189 article details 105199339 https blog csdn net weixin 38169769 article details 99894
  • 在打印ASCII值是26的字符的时候,输出的结果不认识

    现象 解决办法 32其实是一种转义字符 后面的32是8进制的 8进制的32代表的就是2 8 0 3 8 1 结果为十进制的26 在ASCII表里边0 31个字符 开头的32个字符 以及第127个字符 最后一个字符 都是不可见的 无法显示 但
  • 封装 x-spreadsheet 带样式导入导出

    接上两篇 vue 下使用 exceljs x spreadsheet 带样式导入Excel vue 下使用 exceljs x spreadsheet 带样式导出Excel 下面封装好一个组件
  • gan与dcgan训练自己的数据集

    gan https blog csdn net weixin 50113231 article details 122959899 dcgan 源码地址 https github com carpedm20 DCGAN tensorflow
  • freertos---软定时器

    一 软件定时器介绍 freeRTOS软件定时器的时基是基于系统时钟节拍实现的 可以创建很多个 在硬件定时器资源不充足的情况下非常有用 软件定时器一般用作周期性地执行函数 在创建软件定时器时指定软件定时器的回调函数 在回调函数中实现相应的功能
  • Unity TrailRenderer 画出轮胎压痕

    需求 在车拐弯的时候出现轮胎压痕 压痕出现条件 轮胎触碰到地板 轮胎角度有偏移 轮胎在转动 胎痕是断续的 所以每一段胎痕是单独的一个TrailRenderer 轮胎的转动跟角度可以通过wheelCollider来判断 轮胎触碰地板可以通过W
  • C++指针(坚持更新c++内容的第1天)

    概述 c c 语言强大 效率高 很大的程度是体现在指针的灵活运用上面 即便是有经验的程序员使用指针也会因指针的错误而受折磨 本文参考各位大佬的资料来记录一下有关于指针的概念以及相关用法 1 什么是指针 复合类型 compound type