C++学习第九课:指针的精髓与应用

C++学习第九课:指针的精髓与应用

1. 指针基础

指针是一种存储内存地址的变量,它指向另一个变量的内存位置。

int var = 10;
int *ptr = &var; // ptr是指向var的指针

2. 声明和初始化指针

声明指针时在类型前加星号(*)。

int *ptr; // 声明一个整型指针
ptr = &var; // 初始化指针,指向var的地址

3. 指针的解引用

使用星号(*)运算符来获取指针指向的数据。

std::cout << *ptr << std::endl; // 输出var的值

4. 指针的地址

指针本身也有地址,使用&运算符获取指针变量的地址。

int **ptr_to_ptr = &ptr; // 创建一个指向指针的指针

5. 指针与数组

数组名可以作为指向数组首元素的指针。

int arr[] = {1, 2, 3};
int *p = arr; // p指向数组arr的第一个元素

6. 动态内存分配

使用newdelete进行动态内存分配和释放。

int *p = new int(100); // 分配一个整数并初始化为100
delete p; // 释放分配的内存

7. 指针与函数

函数可以将指针作为参数,操作指针指向的数据。

void updateValue(int *p) {*p += 10;
}int main() {int value = 5;updateValue(&value);std::cout << value << std::endl; // 输出15
}

8. 指针的算术运算

可以对指针进行加法和减法运算,指针的值会相应增减。

int arr[] = {10, 20, 30, 40, 50};
for (int *p = arr; p < arr + 5; ++p) {std::cout << *p << " "; // 使用指针遍历数组
}

9. 指针的常量性

使用const声明指向常量的指针或常量指针。

const int *ptr = &var; // 指向常量的指针,不能通过ptr修改var
int *const ptr2 = &var; // 常量指针,ptr2的值不能改变

10. sizeof与指针

sizeof运算符返回指针变量的大小,而非其指向的数据的大小。

std::cout << "Size of pointer: " << sizeof(ptr) << " bytes\n";

11. 函数重载与指针

可以利用指针进行函数重载。

void print(int *ptr) {std::cout << *ptr << std::endl;
}void print(double *ptr) {std::cout << *ptr << std::endl;
}

12. Lambda表达式与指针

Lambda表达式可以捕获指针并使用它。

auto lambda = [ptr] { return *ptr; };
std::cout << lambda() << std::endl; // 输出ptr指向的值

代码详解示例

为了让初学者更易于理解,我们将通过一个简单的程序来展示指针的基本概念和应用。

#include <iostream>// 函数原型:打印一个整数的值
void printValue(int value);int main() {int data = 42; // 定义一个整数int *ptr = &data; // 创建一个指向整数的指针// 使用指针访问数据std::cout << "Value at pointer: " << *ptr << std::endl;std::cout << "Address stored in pointer: " << ptr << std::endl;std::cout << "Address of data: " << &data << std::endl;// 指针的自增操作int arr[] = {10, 20, 30, 40, 50};int *p = arr;for (int i = 0; i < 5; ++i) {std::cout << *(p + i) << " "; // 使用指针运算访问数组元素}std::cout << std::endl;// 动态内存分配int *dynamicInt = new int(100); // 分配内存并初始化printValue(*dynamicInt); // 打印动态分配的整数的值delete dynamicInt; // 释放内存// 函数返回指针int *result = findMax(arr, 5); // 假设findMax函数返回数组中的最大值的指针std::cout << "Max value is: " << *result << std::endl;return 0;
}// 函数定义:打印一个整数的值
void printValue(int value) {std::cout << "The value is " << value << std::endl;
}// 假设的findMax函数原型
int *findMax(int arr[], int size) {// ... (函数实现)return &arr[4]; // 这里仅作为示例返回最后一个元素的地址
}

通过上述示例,我们展示了如何声明和初始化指针、通过指针访问和修改数据、使用指针进行数组遍历、动态内存分配以及指针与函数的交互。这些是C++中指针使用的基础知识,掌握它们对于后续的学习至关重要。

结语

指针是C++中非常强大的工具,它们提供了对内存的直接控制能力。然而,不当的使用也可能导致程序出错,比如内存泄漏或者野指针问题。因此,理解指针的概念和正确使用指针是C++学习者必须掌握的技能。

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

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

相关文章

STK与matlab交互 Astrogator模块(13)

一、背景介绍 在本文介绍一个场景&#xff0c;五颗蓝方卫星和一颗红方卫星&#xff0c;在两个小时之内&#xff0c;使用神经网络等人工智能算法&#xff0c;实现一个轨道追踪的问题&#xff0c;其中接口输入是六颗卫星在J2000坐标系下的坐标&#xff0c;接口输出是该六颗卫星沿…

使用ssh一台机器跳转到另一台机器

//默认端口是22. 1、ssh 用户名ipssh root192.168.111.3//如果端口不是22需要指定端口 2、ssh -p 端口号 用户名ip ssh -p 8888 root192.168.111.3

vue中@click.prevent函数的使用

一个困扰我很久的问题&#xff0c;后端使用djangoDRF框架开发api&#xff0c;前端使用vueaxioselement plus写的登录功能&#xff0c;后端已经设置了允许跨域&#xff0c;使用postman请求接口正常&#xff0c;但是使用浏览器登录时&#xff0c;后端返回[25/Apr/2024 18:13:13,1…

windows下安装onlyoffice

文章目录 1、 安装ErLang2、 安装rabbitmq3、 安装postgresql4、 安装onlyoffice(社区版) 1、 安装ErLang 下载地址&#xff1a;https://erlang.org/download/otp_win64_24.2.exe opt_wind64_24.2.exe 直接运行&#xff0c;一步一步安装 2、 安装rabbitmq 下载地址&#xf…

.NET C# ORM 瀚高数据库

SqlSugar ORM SqlSugar 是一款 老牌 .NET开源ORM框架&#xff0c;由果糖大数据科技团队维护和更新 &#xff0c;开箱即用最易上手的ORM 优点 &#xff1a;【生态丰富】【高性能】【超简单】 【功能全面】 【多库兼容】【适合产品】 【SqlSugar视频教程】 支持 &#xff1a…

linux部署java1.8(java17)

两种方式&#xff1a; 方式一 1.输入查找命令&#xff1a; yum -y list java*2.输入安装命令&#xff1a; yum install -y java-1.8.0-openjdk.x86_643.测试是否已经安装&#xff1a; java -version方式二&#xff1a; 点击链接进入官网&#xff1a;https://www.oracle.com/…

go设计模式之组合设计模式

组合设计模式 简介 将对象组合成树形结构以表示“部分-整体”的层次结构。组合设计模式使得用户对单个对象和组合对象的使用具有一致性。 参与者 Component 为组合中的对象声明接口 Leaf 在组合中表示叶子节点对象。 Composite 存储子部件。访问和管理子部件。 案例1 c…

H3C无线AP管理命令

先上链接 01-AP管理命令-新华三集团-H3C display wlan ap all

程序设计:C语言 调用命令行程序并获得输出 popen(源码)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 这是个很基本的功能&#xff0…

记录不熟悉的函数用法(C++)——assign

1. assign (仅顺序容器) 记录起因&#xff1a;不知道一个vector给另一个vector在不是初始化时是如何赋值的&#xff0c;于是翻看《C Primer》&#xff0c;在“标准库类型vector”这一节中&#xff0c;并没有得到解答。于是&#xff0c;上网搜索&#xff0c;搜到一篇&#xff0…

redis安装配置

简单启动一个redis容器 拉取redis镜像&#xff1a;(更多版本看https://hub.docker.com/_/redis/tags) sudo docker pull redis:7.2.4简单启动一个redis服务 &#xff0c;–requirepass 指定密码 123456 sudo docker run -d \ --name redis \ --restartalways \ -p 6379:6379…

Java 如何避免代码中大量的 if else 判断

文章目录 Java 如何避免代码中大量的 if else 判断解决方案1.策略模式2.工厂模式3.策略模式 工厂模式4.提前 return&#xff08;适用于分支逻辑很简单的 if else&#xff09;5.枚举 Java 如何避免代码中大量的 if else 判断 在代码中经常会出现 if else 判断&#xff0c;如下…

当众演讲技巧的方法有哪些(3篇)

当众演讲技巧的方法有哪些&#xff08;3篇&#xff09; 当众演讲技巧的方法有很多&#xff0c;下面我将分三篇来详细阐述其中的一些关键技巧&#xff1a; **篇&#xff1a;准备与开场技巧 充分准备&#xff1a;提前规划演讲内容&#xff0c;明确主题和目标&#xff0c;准备详…

自然语言转SQL 学习笔记

自然语言转SQL 学习笔记 0. 引言1. 技巧1. **明确数据库表的结构**2. **表间关联的明确说明**3. **字段格式的具体说明**4. **字段取值的具体范围**5. **专业术语的准确定义**6. **数据库类型的指定**7. **考虑查询性能优化**8. **事务处理和一致性需求**9. **数据聚合和分组需…

【蓝桥杯C++A组省三 | 一场勇敢的征途与致19岁的信】

随着4.13西大四楼考场的倒计时结束… 就这样蓝桥杯落幕了 省三的名次既满足又不甘心&#xff0c;但又确乎说得上是19岁途中的又一枚勋章 从去年得知&#xff0c;纠结是否要报名、到寒假开始战战兢兢地准备、陆续开始创作博客&#xff0c;记录好题和成长……感谢你们的关注&…

APT预警攻击平台截获Nday

APT预警攻击平台截获Nday 2024年4月26日 设备漏洞【漏洞利用】H3C Magic R100任意代码执行漏洞(CVE-2022-34598) 0000 &#xff1a; 0010 &#xff1a; 0020 &#xff1a; 0030 &#xff1a; 0040 &#xff1a; 0050 &#xff1a; 0060 &#xff1a; 0070 &#xff1a;6F 72…

请求接口报错:java.lang.IllegalStateException: argument type mismatch

目录 一、场景二、报错信息三、控制器四、接口调用五、原因六、解决 一、场景 1、调用后端接口报错 2、接口参数以Json方式传递 – 二、报错信息 java.lang.IllegalStateException: argument type mismatch Controller [com.xxx.huarunshouzheng.controller.MallControlle…

线性结构与树形结构的区别

线性结构与树形结构在数据组织和关系表达上存在显著的差异。 线性结构是一个有序的数据元素的集合&#xff0c;其中的每个数据元素都有且仅有一个直接前驱和一个直接后继&#xff08;除了第一个元素没有前驱&#xff0c;最后一个元素没有后继&#xff09;。这种一对一的关系使得…

CCF-CSP真题题解:201409-3 字符串匹配

201409-3 字符串匹配 #include <iostream> #include <cstring> #include <algorithm> using namespace std;int n, type; string s, p;string tolower(string s) {string res;for (char c : s) res tolower(c);return res; }int main() {cin >> p >…

2024年华东杯数学建模思路+论文+代码

B 题 自动驾驶中的转弯问题 随着科学技术的迅速发展&#xff0c;自动驾驶已不再是无法触及的奇迹。但自动驾驶也面临着 一系列的技术难题和安全挑战。自动驾驶汽车需要精确、实时地感知和理解环境&#xff0c;以便做 出高效的驾驶决策。在遇到复杂天气时&#xff0c;还需要…