C++开发基础——指针与引用

关于二叉树的线索化以及C语言函数调用问题 最近在看数据结构,写到线索二叉树的时候才明白为什么C++中要有引用传值了,真的很方便好吗… 以上纯属瞎扯,那么下面进入正题 一:关于C++中的值传递,指针传递以及引用传递详解 首先参考的书籍上提到了引用(&)的概念,而我所使用的c语言并不支持引用类型,所以只好用指针代替,但是两者有一些细微的差别如下: 从概念上讲,指针的本质就是存放变量地址的一个变量,在逻辑上是独立的,他可以被改变,包括其... 阅读详情

一,关于指针

1.指针的基础概念

指针是可存储地址的变量,存储在指针中的地址可以是变量或者其他数据的地址。

指针不仅仅是指向某地址,指针还关注指向该地址的数据类型。

例如:long* num_ptr {};

这里的num_ptr指针今后只能存储long类型的变量地址,尝试用它存储非long类型的变量地址将会产生编译报错。

注意,无论指针变量指向什么类型或者大小的数据,指针变量本身的大小是相同的,指针变量的大小仅仅取决于目标平台的可寻址内存的大小。例如,对于64位的计算机架构,指针变量的大小一般是8个字节。

2.指针的定义和使用

a.指针的初始化

未初始化的指针使用起来风险很大,因此,定义指针的同时必须初始化,如果不知道指定什么样的初始值,可以先初始化为nullptr。

因此,下面这段代码:

long* num_ptr {};

应该改为:

long* num_ptr {nullptr};

也可以使用自定义类型来初始化指针:

char16_t* char_ptr {nullptr};

b.指针的具体使用

(1)指针赋值

对指针变量使用操作符"="会改变指针的指向,所以,对指针采取赋值操作可以理解为指针方向的重定向。

例如,如果p1和p2是两个指针变量,"p2=p1"操作会让p2去指向p1当前正在指向的内存地址。

(2)指针的算术运算

算术运算的本质是让指针沿着一定的方向去移动指定大小的单位。

拿指针的加法运算举例,整数会先和指针所指向的类型大小(单位是字节)相乘,得到偏移量,然后指针的初始地址按照这个偏移量往前移动一定的单位。

3.地址运算符&

地址运算符"&"可以获取变量的内存地址,常用于指针变量的初始化。

&可以应用在任何类型的变量上面,然后用变量对应的指针类型去存储变量的地址。

例如要获得int类型变量的地址,则存储地址的指针必须也是int类型。

int num=10;
int* p_num=#
auto p_num=# //也可以让编译器判断类型
auto* p_num=# //auto*,让代码更清晰

4.解引用运算符*

间接运算符"*"可以获取内存地址所存储的对应的变量值。

因为"*"是通过内存地址来间接获取变量的值,所以称为间接运算符,通常也称它为解引用运算符。

符号"*"有时候是用来声明指针的,有时候是用来解引用的。

当它和类型放在一起,例如"int*",便是声明指针的;

当它和变量放在一起(前面没有加类型或者auto),例如"*p_value",便是解引用的。

下面这段处理逻辑相当于:"data_2 = data_1"。

ptr = &data_1;
data_2 = *ptr;

5.char类型与指针

代码样例: 

char* char_ptr {"Hello"};

初始化char*类型指针的示意图

在C语言的写法中,char数组不能被改变,因此在C++的初始化代码中,需要在char*前面加const修饰符,避免编译报错。

const char* char_ptr {"Hello"};

注意,指向数值类型的指针必须解引用,才能拿到指针所指向的元素值。但是指向char类型的指针,可以不经过解引用,直接利用指针名获得元素的值。有时候,为了让代码更清晰,也会对char类型的指针做解引用操作。

完整C++代码实现: 

#include <iostream>
using namespace std;
int main()
{
       const char* char_ptr{ "Hello" };

       std::cout << char_ptr[0] << std::endl;
       std::cout << *char_ptr << std::endl;
       std::cout << char_ptr[1] << std::endl;
       std::cout << *(char_ptr + 1) << std::endl;
       return 0;
}

运行结果:

H
H
e
e

6.数组与指针

a.指向数组的指针

该指针指向数组中的第一个元素。

当程序使用new分配一段内存块时,应使用delete来释放。但是当使用new创建数组时,应该使用"delete []"来释放数组。

int* p_array = new int [10];
delete [] p_array;

此时,访问该数组也很简单,可以把指针变量名当作数组名来使用。

完整C++代码实现: 

#include <random>
#include <iostream>
#include <memory>
#include <functional>
int main()
{
       int* p_array = new int[10];

       p_array[0] = 11;
       p_array[1] = 22;

       std::cout << &p_array << std::endl;
       std::cout << p_array << std::endl;
       std::cout << p_array+1 << std::endl;
       //指针变量当数组来用
       std::cout << p_array[0] << std::endl;
       std::cout << p_array[1] << std::endl;
       //对数组指针解引用
       std::cout << *p_array << std::endl;
       std::cout << *(p_array+1) << std::endl;
       delete [] p_array;
}

运行结果: 

006CFCC4
00BEC170
00BEC174
11
22
11
22

b.指针数组

指针与数组还可以形成另一种结构,被称为指针数组,数组的元素都是指针类型。指针数组的使用可以节省操作时间,如果要交换数组中的元素,只需要交换彼此的指针就可以实现,避免了很多复制操作。

如图,基于指针数组实现的二维数组:

完整C++代码实现: 

#include <iostream>
using namespace std;
int main()
{
       int N = 3;
       int** p = new int* [N];
       int x = 1;
       for (int i = 0; i < N; i++) {
              p[i] = new int[N];
              for (int j = 0; j < N; j++, x++) {
                      p[i][j] = 10 * x;
              }
       }
       cout << *p << endl;
       cout << **p << endl;
       cout << *p + 1 << endl;
       cout << **p + 1 << endl;
       cout << *(*(p + 1) + 0) << endl;
       cout << p[2][2] << endl;
       return 0;
}

运行结果:

015420A8
10
015420AC
11
40
90

7.const与指针

const与指针结合使用,分下面三种情况: 

(1)指向常量的指针——存储的值为常量,指针为变量。

指针所指向的常量值不可以被修改,但是指针可以被修改为指向其他常量的地址。

此时的指针常用来指向const类型的常量。

const int value {20};
const int* p_value=&value;  //const类型的常量value

此时value是一个常量,它的大小不能被修改,但是可以修改p_value指向的地址,例如:

const int value_2 {30};
p_value=&value_2;

如果要禁止修改p_value指向的地址,可以在p_value前面再加一个const修饰符。

const int* const p_value=&value;

(2)常量指针——存储的值为变量,指针为常量。

常量指针只能指向初始化时指定的固定地址,此时虽然指针指向的地址不可以被修改,但是地址存放的变量值可以被修改。

此时的指针常用来指向非const类型的变量。

int data {20}; //此时不能用const
int* const p_data=&data;
*p_data = 30;      //data的值被修改为30

(3)指向常量的常量指针——存储的值为常量,指针为常量

此时,指针被声明为常量,且指向的是不可被修改的常量。指针指向的地址,地址存放的值,都不可以被修改。

const float value {3.1415f};
const float* const p_value=&value;

完整C++代码实现: 

Demo1:

#include <iostream>
int main()
{
    int x{ 5 };
    int y{ 6 };
    int* const ptr{ &x };
    ptr = &y;
    return 0;
}

运行结果:

编译报错:
“ptr”: 不能给常量赋值

Demo2:

#include <iostream>

int main()
{
    int x{ 5 };
    int* const ptr{ &x };

    std::cout << x << std::endl;
    std::cout << &x << std::endl;

    *ptr = 6; //x的地址不变,值被改为6
    std::cout << x << std::endl;
    std::cout << &x << std::endl;

    return 0;
}

运行结果:

5
004FFA60
6
004FFA60

二,关于引用

1.引用的基础概念

引用的用法和指针类似,引用可以看作是某变量的别名,变量的引用在用法上和变量完全对等。

2.引用和指针的不同点

1.引用被声明时必须被初始化。 一般用另外一个变量来初始化引用,使引用成为该变量的别名。

2.引用不能在中途被修改为指向别的变量,一旦引用被初始化为某个变量的别名,那么在这个引用的生命周期内,将一直引用该变量。

引用和指针的使用,在很多场景下减少了拷贝的操作次数,增加了代码的运行效率。

3.引用的初始化

引用的定义方式有些类似于指针,指针在定义的时候,是类型名+"*",引用在定义的时候,是类型名+"&"。

关于"&"的位置,指针初始化时,"&"放在赋值语句右边;引用初始化时,"&"放在赋值语句左边。

引用可以和原始变量保持一样的使用方式,不需要解引用。

int value_1 {20};
int value_2 {20};
int* p_value=&value_1;  //指针的初始化
int& r_value=value_2;   //引用的初始化

*p_value += 10; //解引用
r_value += 10;  //没有解引用

注意,引用中的"&"也被当作是地址运算符,"r_value"是变量value_2的别名,"&r_value"是指向变量value_2的地址。

完整C++代码实现:

#include <random>
#include <iostream>
#include <memory>
#include <functional>
int main()
{
       int value_1{ 20 };
       int value_2{ 20 };
       int* p_value = &value_1;  //指针的定义
       int& r_value = value_2;   //引用的定义
       *p_value += 10; //解引用
       r_value += 10;  //没有解引用
       std::cout <<"value_1: " << value_1 << std::endl;
       std::cout <<"value_2: " << value_2 << std::endl;
       std::cout <<"data of value_1: " << *p_value << std::endl;
       std::cout <<"address of value_1: " << p_value << std::endl;
       std::cout <<"data of value_2: " << r_value << std::endl;
       std::cout <<"address of value_2: "  << &r_value << std::endl;
}

运行结果:

value_1: 30
value_2: 30
data of value_1: 30
address of value_1: 0048FAE8
data of value_2: 30
address of value_2: 0048FADC

4.函数的引用传参

函数传参有两种方式: 

1,按值传递:

传参样例:funtion_name(int param1)

传递的是值,实际上传入的是原始变量的一个副本,因此不会修改原始变量的值。

2,按引用传递:

传参样例:funtion_name(int& param2)

传递的是引用,实际上传入的是指向原始变量的一个指针,因此会修改原始变量的值。

因此,引用传参的主要目的有:

为了在调用函数的时候,顺带修改原始变量的值。

为了在调用函数的时候,减少变量副本的生成。

5.函数的const引用传参

很多开发场景经常这样使用,函数在按引用传递参数的同时,加入了const修饰符。

传参样例:funtion_name(const int& param3)

const引用传参的特点: 

1.向函数传入的是指向原始变量的一个指针,避免了原始变量的副本生成。

2.利用const修饰符,不允许修改原始变量。

const引用传参的主要目的是为了提升代码效率,因为它既不会像按值传递那样,会拷贝一个副本出来,也不会像按引用传递那样,原始变量值会在函数调用期间被任意修改。

完整C++代码实现: 

#include <iostream>
using namespace std;

void swap_1(int& x, int& y);
void swap_2(const int& x, const int& y);

int main() {
    int a = 100;
    int b = 200;

    cout << "Before swap_1, value of a :" << a << endl;
    cout << "Before swap_1, value of b :" << b << endl;

    swap_1(a, b);
    cout << "After swap_1, value of a :" << a << endl;
    cout << "After swap_1, value of b :" << b << endl;

    swap_2(a, b);
    cout << "After swap_2, value of a :" << a << endl;
    cout << "After swap_2, value of b :" << b << endl;
    return 0;
}

void swap_1(int& x, int& y) {
    int temp;
    temp = x;
    x = y;
    y = temp;

    return;
}

void swap_2(const int& x, const int& y) {
    int temp;
    temp = x;
    /*
    这样操作会产生编译报错
    x = y;
    y = temp;
    */
    return;
}

运行结果:

Before swap_1, value of a :100
Before swap_1, value of b :200
After swap_1, value of a :200
After swap_1, value of b :100
After swap_2, value of a :200
After swap_2, value of b :100

三,参考阅读

《Beginning C++17, 5th Edition》

《C++ Primer Plus》

《C++高级编程》

https://en.cppreference.com/w/cpp/language/pointer

https://cplusplus.com/doc/tutorial/pointers/

https://www.programiz.com/cpp-programming/pointers-arrays

https://www.geeksforgeeks.org/creating-array-of-pointers-in-cpp/

C++ 指针和引用,一文读懂! 指针和引用是 C++ 中的两个基础概念,也是许多初学者感到困惑的地方。它们在内存管理、参数传递、动态数据结构等方面发挥着重要作用。本文将详细解释指针和引用的概念、它们之间的区别,以及在何时、为何使用它们。 阅读详情

相关推荐

实现带引用计数的C++智能指针

引用计数是一种资源管理技术,用于跟踪资源被引用的次数。在智能指针的上下文中,每个资源对象都与一个计数器相关联。每当有一个新的引用指向该对象时,计数器就会增加;而当引用被销毁或不再指向该对象时,计数器就会减少。当计数器的值减少到零时,说明没有更多的引用指向该对象,资源就可以被安全地释放。这种方法简化了资源管理,因为程序员不需要手动调用释放函数,而是在对象生命周期的末尾,由引用计数机制自动进行清理。SharedPtr模板类允许SharedPtr。

weixin_42591413的博客 894

【C++】C++ 引用详解 ⑦ ( 指针的引用 )

一、二级指针可实现的效果 二、指针的引用 1、指针的引用 等同于 二级指针 ( 重点概念 ) 2、引用本质 - 函数间接赋值简化版本 3、代码示例 - 指针的引用

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2946

从零开始安装 Windows 11 和 Ubuntu 22.04 双系统

本文详解Windows与Ubuntu 22.04双系统安装流程:需提前确认BIOS模式(UEFI/GPT或Legacy/MBR),关闭BitLocker加密、设备加密及快速启动;推荐Rufus/Ventoy制作启动盘。安装时需规划分区方案(建议单独划分EFI系统分区),注意引导器安装位置选择。双系统启动通过BIOS引导顺序管理,安装后需同步Windows与Linux系统时间。教程适配主流UEFI+GPT设备,强调操作前数据备份及Windows更新策略调整,避免兼容性问题。

萑澈的博客 3767

c++中引用及指针详解

这里写目录标题1、指针1.1、什么是指针指针的本质指针与地址程序中如何声明指针以及如何使用运算符&和*1.2、指针有什么作用指针与函数参数指针与数组字符指针与函数2、引用2.1、什么是引用2.2、引用用什么作用2.3、引用的作用3、const3.1指针与const3.2、引用与const 1、指针 1.1、什么是指针 指针的本质 通俗来说 指针是一个变量 (保存变量地址的变量)像常见的: int a=10; 指针与地址 首先 ,我们通过一个简单 的示意图来说明内存是如何组织的。通常机器都有一系列连

weixin_48560325的博客 9796

arduino esp8266_Arduino传感器教程 第22章ESP8266 控制 5V 继电器

ESP8266控制5V继电器目录一、NodeMCU二、工作原理本文将使用亚马逊 AlexaEcho 和 ESP8266 控制 5V 继电器。NodeMCUNodeMCU 是一个开源的 IoT 物联网硬件开发板,由于它支持 WIFI 功能且使用方法十分类似 Arduino 开发板,所以近些年获得了越来越多来自全世界的创客朋友们的青睐。NodeMCU 尺寸与 Arduino Nano 类似。...

weixin_39611722的博客 3456

团子杂记:SAP收入确认工具RAR(Revenue Recognition&Reporting)在新收入准则下的应用

SAP收入确认工具RAR知识分享

Lucas1211的博客 4284

C++ 指针与引用

C++ 指针与引用

SpriCoder的博客 2651

Delphi解决 openssl DLL 与 Indy 的SSL/TLS 连接问题

​ 使用 SSL 连接时出错。错误 1409442E:SSL 例程:ssl3_read_bytes:tlsv1 警报协议版本 由于我使用的是最新版本的Indy,根据Delphi Praxis 上的此线程,这种情况不应该发生。事实证明,不知何故,一个非常旧版本的 openssl DLLlibeay32.dll和ssleay32.dll已被放置在我计算机上的 sarch 路径中(版本 1.0.0e)。

Delphi开发局QQ群:32422310 2494

嵌入式Qt开发C++编程基础指针、引用和函数

在C++中,指针是一个变量,其值为另一个变量的地址。通过使用指针,你可以直接访问和操作内存中的特定位置。

weixin_73497355的博客 1308

Python+Flask+Echarts打造全国气象数据可视化分析大屏

本文详细介绍了如何使用Python+Flask+Echarts构建全国气象数据可视化分析大屏,实现实时监控、趋势分析和快速决策。通过Python强大的数据处理能力、Flask的轻量级优势和Echarts的交互体验,打造高效的气象数据可视化系统,提升农业、物流等行业的决策效率。

weixin_29061531的博客 1060

Mathtype公式排版避坑指南:固定行距20磅下如何完美显示上下标(实测有效)

本文针对学术论文在固定行距20磅要求下,Mathtype公式上下标显示不全或被裁剪的问题,提供了实测有效的解决方案。文章深入剖析了固定行距与公式排版的冲突原理,并详细指导用户通过调整Mathtype的“定义间距”参数(如下标深度、上标高度),以及利用“格式化公式”功能进行批量处理,确保公式在严格遵守期刊格式要求的同时清晰完整显示。

weixin_29228203的博客 1069

C++基础概念

本文围绕 C++ 学习与实践,分三大板块:先概述 C++ 开发者应具备的核心能力与学习路径;接着进入“基础概念”章,通过对**函数**(声明、定义、分文件、值传递、调用)、**Struct 结构体**(数组、指针、嵌套、const)、**指针**(用法、运算符、空指针、修饰符)、**数组与容器**(原生数组、std::array、std::vector、链表、栈队列、deque)、**内存模型**(代码区/全局区、栈/堆、new)、**引用**、**函数进阶**(默认参数、可变参数、重载)及**封装**(s

草履虫建模的博客 4325

opencv简单小项目

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像和视频处理功能。要开始一个OpenCV项目,你需要安装OpenCV库,这通常可以通过Python的pip包管理器完成。替换为你要加载的图像的实际路径。这个例子展示了OpenCV项目的基本结构,你可以在此基础上添加更多的图像处理功能。如果你需要更详细的指导或代码示例,请告诉我你的具体需求。

youyouxiong的博客 972

黑马程序员C++笔记--第一阶段基础:【指针和引用】

指针定义指针定义:const 修饰指针1.常量指针2.指针常量指针运算赋值运算算数运算学习产出: 指针定义: 在32位操作系统下 ,指针只占4个空间字节大小 在64位操作系统下 ,指针只占8个空间字节大小 *空指针用于给指针变量进行初始化,不可以进行访问 int p=NULL; #include<iostream> using namespace std; int mian() { //1.定义指针 int a = 10; //整型变量 int *p; //int *p = &am

十七阿哥的博客 589

OpenFeign, Zuul, Gateway相互不兼容的问题总结

版本 Lib Vresion spring-cloud-starter-gateway 3.1.0 spring-cloud-dependencies 2021.0.0 spring-cloud-starter-netflix-zuul 2.2.6.RELEASE spring-cloud-starter-openfeign 3.1.0 1. Zuul 与OpenFeign 一起使用的问题 错误信息 jav.

Harry的博客 4132

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

学霸带你游戏化 C++ 指针及引用

在 C++ 中,指针是存储变量内存地址的特殊变量。它允许程序员直接操作内存,从而实现动态内存分配和复杂数据结构的管理。例如,在《只狼:影逝二度》(Sekiro: Shadows Die Twice)中,游戏引擎通过指针管理角色状态和环境变量,实现了高效的性能优化。

纽雪澳诺加海美德的博客 932

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Cpp入门续

引用、const引用、inline内联

2401_86658278的博客 917

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

吃透C++函数传参:传值、传指针、传引用,一篇分清(新手避坑)

本文用通俗易懂的"房子装修"比喻,详解C++函数传参的三种方式:传值调用(递复印件)、传指针调用(递地址纸条)和传引用调用(告知小名)。通过代码示例对比了三者的核心区别:能否修改实参、内存占用、安全性等,并给出适用场景建议。特别指出新手常见的4个踩坑点,如传值修改实参无效、指针未解引用等。总结建议:优先使用传引用调用(简单安全),需要空值时用指针,仅读操作用传值。帮助读者从概念理解到实际应用,掌握函数传参的正确使用方式。

whb7807810的专栏 900

cpp基础入门~~c语言的补足

设计哲学思考:虽然符号复用确实可能造成初学者的困惑(如&的多义性),但保持语言简洁性也是重要的设计考量。📚扩展阅读:《Effective Modern C+》条款18讲智能指针与引用的配合使用,《A Tour of C+》第7章详细讨论指针与引用的设计哲学。> 🌟 **最佳实践建议**:即使是简单测试程序也建议使用`.cpp`扩展名和C++标准写法(如cout/cin),以培养规范的C++编码习惯。- Windows (VS):`.c`文件 → C编译器 / `.cpp` → C++编译器。

2401_85286030的博客 1282

C++编程入门:从基础语法到开发环境配置完整指南

C++作为一门系统级编程语言,融合了C语言的高效性和面向对象编程特性。其核心原理在于通过RAII(资源获取即初始化)机制实现自动内存管理,同时支持模板泛型编程,显著提升了代码复用性和类型安全性。在技术价值方面,C++在性能敏感场景如游戏引擎、操作系统开发中具有不可替代的优势。现代C++版本(C++11/14/17)引入了智能指针、自动类型推导等特性,进一步简化了内存管理和代码编写。对于初学者而言,搭建稳定的开发环境是首要步骤,推荐使用Visual Studio Code配合MinGW-w64编译器,通过配置

weixin_34356310的博客 346

C++面试基础知识汇总

C++基础与预处理 C++源文件从文本到可执行文件经历的过程 预编译阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。 编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件 汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件 链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件 ++i和i++的区别 ++i表示先自增,再打印自增后的值 i++表示先打印原始值,再将i加1 -i++表示先打印-i的值,再将i加1 有符号变

热爱生活的博客 1193

C++指针的几个基本概念

在C++中,指针是一种强大而灵活的概念,用于管理内存和处理复杂的数据结构。

qqliang1314的专栏 470

c++指针

C++指针的本质还是“内存地址”,但通过类指针、const修饰、智能指针等特性,变得更安全、更适配面向对象编程。新手学习路径:先掌握基础语法(定义/解引用/赋值)→ 理解C++专属特性(类指针、new/delete)→ 避坑(野指针、内存泄漏)→ 进阶智能指针。如果说C语言的指针是“内存地址的直接操控者”,那C++的指针就是“升级加强版”——它继承了C指针的核心能力,又融入了面向对象的特性,能适配类、引用、动态内存等场景,成为C++高效编程的核心工具。// 分配int内存,初始值50。

2401_87981514的博客 429

第八章C++面试指针机制全面解析与高级应用

摘要 本文深入解析C++指针机制,从基础概念到高级应用。指针作为C++核心特性,提供了直接内存操作能力,是高效数据结构和系统编程的基础。内容涵盖指针基本原理、内存操作、函数指针、this指针及引用机制,强调安全使用指针的重要性。通过详细代码示例展示指针声明、运算、动态内存管理及void指针应用,帮助读者全面掌握指针知识体系。文章指出,指针理解程度直接影响程序员水平,正确使用可实现高效灵活代码,而错误使用则可能导致严重问题。现代C++虽引入智能指针简化内存管理,但原始指针仍是底层编程不可或缺的工具。

小宝哥Code的专栏 940

C++基础:(二)C++入门知识介绍(下)

本文系统介绍了C++编程中的核心特性:1. 输入输出流机制(iostream),包括cin/cout的使用、类型自动识别及IO效率优化技巧;2. 缺省参数的两种形式(全缺省/半缺省)及其使用规则;3. 函数重载的实现条件(参数类型/数量/顺序不同)及注意事项;4. 引用机制的概念、特性(必须初始化、不可改变指向)与典型应用场景(参数传递、返回值);5. 补充讲解了内联函数(inline)和空指针(nullptr)的特性。这些特性共同构成了C++区别于C语言的重要语法特征,为面向对象编程奠定了技术基础。

2301_79248256的博客 1011

C++ 指针核心知识笔记

void bubbleSort(int arr[], int len) { /* 冒泡排序实现 */ }​。// 数组名本质是数组首元素地址,等价于int* p = &arr[0];void quickSort(int arr[], int len) { /* 快速排序实现 */ }​。// 修改一级指针p的指向(指向新分配的内存)​。// 1=冒泡排序,2=快速排序(可由用户输入)​。// 传入一级指针p的地址(二级指针接收)​。// 输出20(通过p获取a的值)​。// 输出1(指向arr[0])​。

hyn201003的博客 989
上一篇: C++开发基础——函数对象与std::function模板
下一篇: C++开发基础——lambda表达式与std::bind闭包
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员与背包客_CoderZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值