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

server/2024/10/18 3:27:25/

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.ppmy.cn/server/25578.html

相关文章

使用 Docker 自建一款怀旧游戏之 - 扫雷

1&#xff09;扫雷 简介 扫雷 是一种经典的单人电脑游戏&#xff0c;最初由微软公司在 1990 年代开发并内置在 Windows 操作系统中。游戏的目标是在一个由方块组成的网格上揭开所有非地雷的方块&#xff0c;而不触发地雷。每个方块上都标有数字&#xff0c;表示周围 8 个方块中…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-5

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

2 Spring IoC

POM 创建一个工程名为 spring-ioc-demo 的项目&#xff0c;pom.xml 文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSc…

植物大战僵尸杂交版

1.感谢作者潜艇伟伟迷 2.大小大概110M&#xff0c;下载链接在下方 链接&#xff1a;https://pan.baidu.com/s/1Ew6iTg0_d_Ut8N9_18KGLw 提取码&#xff1a;yspa 3.祝大家玩的开心

PS 2018

下载 链接: https://pan.baidu.com/s/12DdGwb7SyHA2jAdO51m1ag?pwdbdxp 提取码: bdxp 安装 第一步&#xff1a; 打开程序。找到并选择“Adobe Photoshop CC 2017”&#xff08;这是可以破解2018版本的&#xff0c;亲测可用&#xff0c;大可放心&#xff09;&#xff0c;然…

linux 编译binutil 遇到问题

在centos6.10上编译binutil2.27时遇到问题&#xff1a; as.c&#x1f4af;31: error: ‘DEFAULT_GENERATE_ELF_STT_COMMON’ undeclared here (not in a function) 搜到解决方法是这个&#xff1a; 1、https://github.com/riscv-software-src/riscv-tools/issues/66 &#xf…

外包干了2个月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;17年通过校招进入武汉某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年五一&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了3年的功能测试&…

http协商缓存和强缓存

强缓存 强缓存则不需要向服务器发送请求&#xff0c;而是从浏览器读取缓存内容&#xff08;内存缓存&#xff5c;硬盘缓存&#xff09; 内存缓存&#xff1a;存储在浏览器内存中&#xff0c;一般刷新浏览器会从内存缓存中获取到缓存内容&#xff0c;优点速度快&#xff0c;缺…