【C++】指针学习 知识点总结+代码记录

一.示例代码知识点总结

1. 基本指针操作

  • 指针声明和初始化int* ptr_a = a; 表示声明了一个指向整型的指针,并初始化为指向数组a的首地址。
  • 引用和指针的区别int& i2 = i; 声明了一个整型引用,绑定到变量i上,而int* ptr_i = &i; 声明了一个指向整型的指针,并初始化为指向变量i的地址。
  • 常量指针和指针常量const int* p1 = &c; 和 int* const p3 = &c; 分别表示指向常量的指针和指针类型的常量。

2. 特殊类型的指针

  • Void指针void* pv; 可以存储任何类型的指针,但需要显式类型转换才能访问。
  • 空指针int* p = 0; 或 int* p0 = NULL; 用于表示指针不指向任何有效地址。

3. 指针与数组

  • 数组名作为指针:数组名a实际上是指向其第一个元素的指针。
  • 指针数组int* pLine[3]; 是一个数组,每个元素是一个指针。
  • 数组指针int(*arrptr)[2] = &arr; 是指向数组的指针,指向一个具有两个整型元素的数组。

4. 指针作为函数参数

  • 函数参数传递split(float x, int *intpart, float *fracpart) 接收指针作为参数,用于输出参数。

5. 指向函数的指针

  • 函数指针声明typedef double (*Double_Int)(int); 定义了一个指向接受整型参数并返回双精度浮点型的函数的指针类型。
  • 函数指针初始化DoubleInt = &doubleint; 初始化函数指针为指向doubleint函数的地址。

6. 类的指针成员

  • 对象指针point* pointptr; 是指向point类实例的指针。
  • this指针:在类的成员函数中,this是一个隐含的指针,指向当前对象。
  • 指向类成员的指针int point::* numberptr; 和 void (point::*showptr)() const; 分别是用于指向类的数据成员和成员函数的指针。

7. 其他

  • 类型转换int* pint = static_cast<int*>(pv); 使用类型转换将void*转换为int*
  • 前向声明class Fred; 和 class Barney; 允许在类定义中引用尚未完全定义的其他类。

8. 标准库函数

  • std::begin 和 std::end 函数用于获取容器的开始和结束迭代器。

二.代码及详细注释

#include<iostream>
//字符串
#include<string>
//格式化输出
#include<iomanip>
//获取类型
#include<typeinfo>
//begin和end函数
#include<iterator>using namespace std;class point {
private:int number;string name;
public:point(int num, string nam) :number(num), name(nam) {  }void show() const;void test() const;
};void point::show() const{cout << "number:" << number << endl;cout << "name:" << name << endl;
}//当局部作用域中声明了与类成员同名的变量,对该标识符的直接引用代表局部中声明的,使用this指针可以访问类成员中的同名变量
void point::test() const {int number = 10;cout << "number:" << number << endl;cout << "this->number:" << this->number << endl;
}//前向引用声明
class Fred;
class Barney {//Fred x;   //错误Fred* x;   //正确
};
class Fred {Barney y;
};//将实数分成整数部分和小数部分
void split(float x, int *intpart, float *fracpart) {*intpart = static_cast<int>(x);*fracpart = x - *intpart;
}double doubleint(int a) {cout << "This is double_int " << endl;return static_cast<double>(a);
}int intdouble(double a) {cout << "This is int_double " << endl;return static_cast<int>(a);
}int main() {//数组名实际上是一个不能被赋值的指针(指针常量)int a[10];int* ptr_a = a;int i;//引号在右边是取地址赋值,在左边表示引用int& i2 = i;int* ptr_i = &i;i = 10;cout << "i = " << i << endl;cout << "*ptr_i = " << *ptr_i << endl;//指向常量的指针(不能通过指针来改变对象的值,但是指针本身可以改变,可以指向另外的对象)int c = 10;const int* p1 = &c;int b = 20;p1 = &b;//*p1 = 10;		编译错误//可以确保指针指向的变量值不通过指针发生改变//指针类型的常量(指针指向不能改变)int* const p3 = &c;//p3 = &b;		编译错误//void类型指针(可以储存任何类型的对象地址)//注:没有viod类型的变量void* pv;int j = 5;pv = &j;cout << "The type of pv : " << typeid(pv).name() << endl;// cout << "*pv = " << *pv;		报错//显示类型转换后才能间接访问int* pint = static_cast<int*>(pv);cout << "The type of pint : " << typeid(pint).name() << endl;cout << "*pint = " << *pint << endl;//空指针(避免指向不确定地址)int* p;p = 0; //表示将p设为空指针,不指向任何地址int* p0 = NULL; //也代表空指针//用指针处理数组元素for (int i = 0; i < 10; i++) {a[i] = i;}//使用数组名和指针运算for (int i = 0; i < 10; i++) {cout << *(a + i) << " ";}cout << endl;//使用指针变量for (int* p = a; p < (a + 10); p++) {cout << *p << " ";}//标准库函数begin和end获取首位元素地址int* beg = begin(a);int* last = end(a);while (beg != last) {cout << *beg << " ";beg++;}cout << endl;//指针数组(本质是一个数组,其中每个数组元素都是一个指针)//利用指针数组输出单位矩阵.cppint line1[] = { 1,0,0 };int line2[] = { 0,1,0 };int line3[] = { 0,0,1 };int* pLine[3] = { line1,line2,line3 };		//定义整型指针数组并为其初始化for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {cout << pLine[i][j] << " ";}cout << endl;}cout << "1---------" << endl;//把二元数组当作指针数组来访问int array[3][3];for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {array[i][j] = i + 2 + j;}}for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {cout << *((*array + i) + j) << " ";}cout << endl;}cout << "2---------" << endl;//数组指针(本质是指针,指向一个数组)int arr[2] = { 10,20 };int(*arrptr)[2] = &arr;cout << *arrptr << endl;	//输出数组名地址for (int i = 0; i < 2; i++) {cout << (*arrptr)[i] << " ";}cout << endl;//用指针作为函数参数//使用引用作为形参传递也能做到相同作用cout << "3---------" << endl;float split_x, fracpart;int intpart;split_x = 3.1425926;split(split_x, &intpart, &fracpart);cout << "X : " << split_x << " intpart:" << intpart << " fracpart:" << fracpart << endl;//指向函数的指针// 函数名表示函数的代码在内存中的起始地址,调用函数的实质就是函数代码首地址,函数指针是来存放函数代码首地址的变量,在程序中可以像使用函数名一样使用指向函数的指针来调用函数//声明了一个有double形参,返回类型为Int的指针typedef double (*Double_Int)(int);//使用yype可以很方便的为复杂类型起别名,把要声明的类型别名放到声明这种类型的变量时书写变量名的位置即可//声明这一类型的变量Double_Int DoubleInt;//直接声明int (*IntDouble)(double);//初始化即直接赋值DoubleInt = &doubleint;   //函数返回值与传参类型必须相同(否则编译错误)IntDouble = intdouble;    //可以取地址也可以不取double dint;dint = doubleint(3);   //函数调用dint = DoubleInt(5);   //指针调用cout << "4---------" << endl;//对象指针point* pointptr;point point1(1,"zhang");pointptr = &point1;pointptr->show();	//使用指针访问对象成员point1.show();	   //使用对象自己访问cout << "5---------" << endl;//this指针point1.test();cout << "6---------" << endl;//指向类的非静态成员的指针int point::* numberptr;		//声明指向数据成员的指针void (point:: * showptr)() const;	  //声明指向函数成员的指针//赋值// numberptr = &point::number;  //不能在外部访问私有成员showptr = &point::show;//通过对象使用指针访问类的非静态成员//point1.*numberptr;//pointptr->*numberptr;(point1.*showptr)();  //必须有括号//通过对象指针访问(pointptr->*showptr)();cout << "7---------" << endl;//指向类的静态成员函数的指针//6_14.cppreturn 0;
}

三.输出结果

不给出参数列表
调用Point给出的默认构造函数
10  10
调用Point析构函数
调用Point给出的默认构造函数
10  10
调用Point析构函数
给出参数列表
调用Point含参构造函数
1  4
调用Point析构函数
-842150451  -842150451
调用Point2析构函数
0  0
调用Point2析构函数
------1------
调用Point给出的默认构造函数
调用Point给出的默认构造函数
10  10
10  10
调用Point析构函数
调用Point析构函数

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

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

相关文章

k3s配置docker容器/dev/shm

在使用K3s和Docker容器时&#xff0c;如果你发现容器的 /dev/shm 默认大小是64MB&#xff0c;并且需要扩大它的大小&#xff0c;可以通过以下几种方法实现。 方法1&#xff1a;使用 Docker 的 --shm-size 选项 如果你直接使用 Docker 运行容器&#xff0c;可以通过 --shm-siz…

jenkins系列-07.轻易级jpom安装

jpom是一个容器化服务管理工具&#xff1a;在线构建&#xff0c;自动部署&#xff0c;日常运维, 比jenkins轻量多了。 本篇介绍mac m1安装jpom: #下载&#xff1a;https://jpom.top/pages/all-downloads/ 解压&#xff1a;/Users/jelex/Documents/work/jpom-2.10.40 启动前修…

git 分支介绍

在Git版本控制系统中&#xff0c;分支&#xff08;Branch&#xff09;是一种非常强大的功能&#xff0c;它允许开发者在不影响主代码库&#xff08;如master分支&#xff09;的情况下进行开发或修复工作。你提到的五种分支类型是在Gitflow工作流&#xff08;Gitflow Workflow&a…

css基础(1)

CSS CCS Syntax CSS 规则由选择器和声明块组成。 CSS选择器 CSS选择器用于查找想要设置样式的HTML元素 一般选择器分为五类 Simple selectors (select elements based on name, id, class) 简单选择器&#xff08;根据名称、id、类选择元素&#xff09; //页面上的所有 …

Git配置笔记

文章目录 Git配置一、Git配置文件1.1 配置文件位置1.2 参考 二、换行符相关2.1 背景2.2 相关配置2.3 推荐配置2.4 参考资料 Git配置 一、Git配置文件 1.1 配置文件位置 Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位…

Web 性能入门指南-1.5 创建 Web 性能优化文化的最佳实践

最成功的网站都有什么共同点&#xff1f;那就是他们都有很强的网站性能和可用性文化。以下是一些经过验证的有效技巧和最佳实践&#xff0c;可帮助您建立健康、快乐、值得庆祝的性能文化。 创建强大的性能优化文化意味着在你的公司或团队中创建一个如下所示的反馈循环&#xff…

MySQL入门学习-深入索引.匹配顺序

在 MySQL 中&#xff0c;索引的匹配顺序是指在查询执行时&#xff0c;数据库系统根据查询条件中涉及的列和索引的结构&#xff0c;决定如何使用索引来提高查询效率的方式。 以下是关于深入索引和匹配顺序的一些详细信息&#xff1a; 一、索引的类型&#xff1a; - B-Tree 索引…

centos7|Linux操作系统|编译最新的OpenSSL-3.3,制作rpm安装包

一、 为什么需要编译rpm包 通常&#xff0c;我们需要安装某个软件&#xff0c;尤其是在centos7这样的操作系统&#xff0c;一般是通过yum包管理器来安装软件&#xff0c;yum的作用是管理rpm包的依赖关系&#xff0c;自动的处理rpm包的安装顺序&#xff0c;安装依赖等的相关问…

交换机和路由器的工作流程

1、交换机工作流程&#xff1a; 将接口中的电流识别为二进制&#xff0c;并转换成数据帧&#xff0c;交换机会记录学习该数据帧的源MAC地址&#xff0c;并将其端口关联起来记录在MAC地址表中。然后查看MAC地址表来查找目标MAC地址&#xff0c;会有一下一些情况&#xff1a; MA…

通过Bugly上报的日志查找崩溃闪退原因

第一步&#xff0c;解析堆栈信息 在bugly上收集到的信息是这样的 0x000000010542e46c 0x0000000104db4000 6792300 OS应用发生崩溃时&#xff0c;系统会生成一份崩溃日志&#xff0c;这份日志中包含了崩溃时的堆栈信息&#xff0c;但这些堆栈信息并非直接指向源代码&#x…

【漏洞复现】某赛通 电子文档安全管理系统 多个接口存在远程命令执行漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

【RAG 实践】LlamaIndex 快速实现一个基于 OpenAI 的 RAG

这是 LlamaIndex 官方 Starter Tutorial 中 demo&#xff0c;用很少的代码来使用 OpenAI 快速实现出一个 RAG。 Ref: Starter Tutorial | LlamaIndex 代码&#xff1a;llamindex-rag-demo | Kaggle 1&#xff09;设置 OpenAI Token 这里使用国内的 OpenAI 中转 API token&…

【Python】数据分析-Matplotlib绘图

数据分析 Jupyter Notebook Jupyter Notebook: 一款用于编程、文档、笔记和展示的软件。 启动命令&#xff1a; jupyter notebookMatplotlib 设置中文格式&#xff1a;plt.rcParams[font.sans-serif] [KaiTi] # 查看本地所有字体 import matplotlib.font_manager a sorted…

802.11ax RU - 传输的最小单元

子载波 无线信号是加载在某个固定频率上进行传输的&#xff0c;这个频率被称为载波。802.11标准中&#xff0c;对传输频率有更新的划分&#xff0c;而这些划分的频率被称为子载波。Wi-Fi 6中&#xff0c;以20Mhz信道为例&#xff0c;20Mhz信道被划分成256个子载波&#xff0c;…

QML 鼠标和键盘事件

学习目标&#xff1a;Qml 鼠标和键盘事件 学习内容 1、QML 鼠标事件处理QML 直接提供 MouseArea 来捕获鼠标事件&#xff0c;该操作必须配合Rectangle 获取指定区域内的鼠标事件, 2、QML 键盘事件处理&#xff0c;并且获取对OML直接通过键盘事件 Keys 监控键盘任意按键应的消…

基于3D感知的端到端具身操作论文导读

DexIL&#xff1a;面向双臂灵巧手柔性操作的端到端具身执行模型 模型架构 输入&#xff1a;   观测Ot&#xff1a; RGB点云&#xff0c;使用PointNet进行编码;   状态St&#xff1a; 双臂末端7x2Dof位姿16x2灵巧手关节位置&#xff0c;只进行归一化&#xff0c;无编码&am…

Linux Win 10 Windows上安装Ollama部署大模型qwen2 7b/15配置启动 LangChain-ChatChat 0.2.10进行对话

Win 10 Window安装Ollama部署qwen2 7b LangChain-ChatChat 环境说明 Win 10 Python 3.11.9 LangChain-ChatChat 0.20 Ollama 0.2.10 Qwen2 1.5b/7b Windows 安装Ollama 下载并安装Windows版Ollama https://ollama.com/download#/ 下载大模型qwen2:1.5b或者qwen2:7b 在命令…

prompt第三讲-PromptTemplate

文章目录 前提回顾PromptTemplateprompt 模板定义以f-string渲染格式以mustache渲染格式以jinja2渲染格式直接实例化PromptTemplatePromptTemplate核心变量 prompt value生成invokeformat_prompt(不建议使用)format(不建议使用) batchstreamainvoke PromptTemplate核心方法part…

从实时监控到风险智能预警:EasyCVR视频AI智能监控技术在工业制造中的应用

随着科技的不断进步和工业制造领域的持续发展&#xff0c;传统的生产管理方式正逐渐转型&#xff0c;迈向更加智能、高效和安全的新阶段。在这个变革过程中&#xff0c;视频智能监控技术凭借其独特的优势&#xff0c;成为工业制造领域的管理新引擎&#xff0c;推动着从“制造”…

访问者模式(大话设计模式)C/C++版本

访问者模式 C #include <iostream> #include <list> using namespace std;class Visitor;// 组成Computer的各组件基类 class Element { public:Element(string strName) : m_strName(strName) {}string GetName(){return m_strName;}// 组件接受访问者访问的接口…