C++ 指针 技术教程文章

结构体指针中const的使用——C++【代码】

const使用后,结构体的内容不能被修改,防止误操作。 #include<iostream> #include<string>using namespace std;//定义学生结构体 struct Student {string name;int age;int score; };//将函数中的形参改为指针,可以节省内存空间。 //而且不会复制一个新的副本出来。 void PrintStuInfo1(const struct Student *p) {//p->age = 100; //加const后这句话就是错误的,p变成不可写的(不可修改了)//加const防止误操作std::cout << "n...

指针常量与常量指针【C++】【代码】【图】

常量指针:const int* (int const*) 一个指针,指向的内容是一个常量,内容不能修改,但指针本身可修改。修改内容时,编译器报错" error: assignment of read-only location ... " 指针常量: int * const 一个常量,常量本身是一个指针,指针本身不能修改,但指针内容可修改。修改指针时,编译器报错" error: assignment of read-only location ... " 如果需要一个指针和指向内容皆为常量,不能更改,可以定义为: const in...

C++何时使用引用、指针?【代码】

1、参数传递的方式:传值和传址(1) 传值方式是将实参的值的拷贝传递给函数(方法),在方法内对形参进行操作,其对象是实参的拷贝,对实参不能造成影响.在方法结束返回后,形参被释放丢弃,实参的内容并不会改变;(2) 传址方式,将实参的地址传递给函数(方法),在方法内对形参进行操作即等于对实参进行相同的操作,在方法结束返回后,形参同样被释放,实参的内容将会是对形参进行操作的结果.传址方式,又可以细分为:引用传递(pass-by-reference...

C++基础--指针--使用指针优化局部变量的复制【代码】

使用指针对访存进行优化 ? 假设现在有一个结构体,里面有非常多的成员,现在要对其使用tostring()方法进行打印 struct a {int aaa;//很多成员 }; int main() {struct a xxx = a{ 123 };tostring(xxx);return 0;}void tostring(struct a instance) {cout << instance.aaa << endl; }在tostring方法体里,要进行局部变量与入参的复制,假设该结构体内有大的数据,则非常占用内存,且复制相当消耗时间。这里可以用指针的方式进行处理...

C++基础--指针 野指针和free【代码】

野指针的重复释放问题 最近发现了这样一个问题,一个指针释放两次之后,若在中间不置空,会报Invalid address specified to RtlValidateHeap 无效的堆地址 错误。 #include <iostream> #include <string> #include <malloc.h>using namespace std; int main() {int* p = (int*)malloc(100);free(p);free(p); }想搞清楚为什么发生这种错误,首先得先搞清楚free()做了什么: #include <iostream>using namespace std;int main() {int...

C++学习笔记之 this指针【代码】

this指针 目录this指针this指针的指向this指针与链式编程思想空指针访问成员函数常函数和常对象 this指针的指向this指针指向被调用的成员函数所属的对象#include <iostream> #include <cstdlib>using namespace std;class Person { public:int a;void func(int var){this->a = var; // 相当于a = varcout << this << ": " << this->a << endl;} };int main() {Person p1;Person p2;p1.func(1);p2.func(2);return 0; }0x61fe8c: 1 0...

C++指针与函数【代码】【图】

函数中的数值传递分为值传递和地址传递。 值传递是单纯的复制,修改的只是形参。 void swap(int a, int b) {int temp = a;a = b;b = temp;cout << "swap a = " << a << endl;cout << "swap b = " << b << endl; }地址传递是由形参复制实参的地址,通过解引用的方式访问这个地址,修改后得到的是实参地址上的数据,也就是通过地址传递是可以修改实参的。 void swap_ptr(int *p1, int *p2) {int temp = *p1;*p1 = *p2;*p2 = temp;cou...

C++知识点杂记2——类成员指针、嵌套类和union【代码】【图】

一、类成员指针 1.概念 类成员指针指向的是类的非static成员,因为类的static成员是所有类对象共有,所以static成员的指针和普通指针没有区别 2.成员变量指针 示例class test { public:test(){}~test(){}int pub;private:int pri; };int main(int argc, char const *argv[]) {int test::*pi=&test::pub;test t;t.*pi=10;cout<<t.pub<<endl;return 0; } 上述代码中pi就是个test的成员变量指针,成员变量指针的读法依旧是从右到左,...

C++ 常指针和指向常量的指针【代码】

常指针和指向常量的指针 转载来源1. 常指针2. 指向常量的指针3. 指向常量的常指针转载来源 https://blog.csdn.net/yangsong4353/article/details/79594535 1. 常指针 格式:char * const p; 特点:const接近p 说明:常指针所指向的地址不能变,但是其所指向的地址中的值可以变。即指针本身是个常量。 举例: char testdata1, testdata2;char* const p = &testdata; // 必须赋初值*p = 0x55;p = &testdata2; // 此句会报错。2. 指向...

C++ 指针和引用的区别【图】

下面用通俗易懂的话来概述一下: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const、volatile等等。见下图,所示指针的含义: 引用-引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用。见下图,所示引用的含义: 2、指针和引用的区别 首先,引用不可以为空,但指针可以为空。前面也说过了引用是对象的别名,引用为空...

C++中指针的分类

const int * p: 指向整形常量 的指针,它指向的值不能修改 int * const p: 指向整形的常量指针 ,它不能在指向别的变量,但指向(变量)的值可以修改。 const int * const p: 指向整形常量 的常量指针 。它既不能再指向别的常量,指向的值也不能修改

c++自己实现简单智能指针【代码】

智能指针的简单实现 在c++中对指针的操作是一件很麻烦的事,因此智能指针应运而生,智能指针使我们在new一个对象的时候不用关心它的释放。首先我们要对指针有一定的了解,指针中最常见的行为便是内容提领(dereference)和成员访问(mermber access)。所谓的智能指针其实是一个将原始指针封装在一个类中,此类中重载了*和->运算符,其中*运算符的重载便实现了内容提领,而->运算符便实现了成员访问。c++标准库中提供了auto_ptr,今天我...

c/c++语言的关键:指针【代码】

指针的简单认识 指针在c中的地位举足轻重,指针是必须要学好。由简入难。一、指针简单定义。二、指针的类型。三、野指针。四、指针运算。五、指针和数组的认识。六、二级指针。七、指针数组。## 一、指针的简单定义 **指针是一种利用地址做运算的工具,它直接指向地址,通过它找到地址的内存单元。** **指针是个变量,存放内存单元的地址。 指针需要先定义,需要使用指针,也要为指针申请一个空间,指针的空间里放的事所指变量的地...

C++智能指针的原理和实现【代码】

一、智能指针起因在C++中,动态内存的管理是由程序员自己申请和释放的,用一对运算符完成:new和delete。new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针;delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存。使用堆内存是非常频繁的操作,容易造成堆内存泄露、二次释放等问题,为了更加容易和更加安全的使用动态内存,C++11中引入了智能指针的概念,方便管理堆内存,使得自动、异常安全的对象生存...

【C++札记】C++智能指针【代码】【图】

本文阅读目录 1、智能指针设计思想 2、智能指针简单使用 3、为什么不建议使用auto_ptr 4、如何选择使用哪种智能指针 智能指针设计思想 在前面C/C++指针使用常见的坑一文中总结了C/C++中使用指针时可能会遇到的各种坑,其中最常见的是内存泄露,大家还记得下面这个例子吧。 在这个例子中,由于抛出异常,delete语句没有机会执行,造成内存泄露。当然对于这个几十行规模的程序来说,你可以在catch语句中再加一句delete t可以避免。 但...

C 与 C++ 中 指向二维数组的指针进行指针运算【代码】

二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 nums 为例: 从概念上理解,nums 的分布像一个矩阵,但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存:1 int nums[2][3] = { 10,20,30,40,50,60 }; 2 //以上定义与下边相同 3 int nums[2][3] = { {10,20,30}, {40,50,60} };在几乎所有的程序语言中,二维数组都是按行排列的,先...

C++ Primer 指针,引用笔记【代码】【图】

引用:& ` int ival = 1024;int &refVal = ival;int &refVal2 // ! 引用必须初始化!而且无法解绑!!!int &refVal3 = refVal; // 正确! 这里其实是绑定到ival 上int i = refVal ; // 正确!!这里i 被初始化为ival 的值`但是!引用本身不是一个对象,所以不能定义引用的引用但是 类型不匹配是不行的! ‘int & refVal4 = 10; // 不行!!!,因为引用必须绑定的是一个对象!!double dval = 3.14;int &...

C++中的智能指针

C++的智能指针:智能指针本质上是一个类,当超出了类的作用域时,会自动调用析构函数释放资源。好处:可以避免出现申请的空间在函数结束时忘记释放,造成内存泄漏。 1. auto_ptr:(采用所有权模式,已被C++11抛弃)auto_ptr< string> p1 (new string ("I reigned lonely as a cloud.”)); auto_ptr<string> p2; p2 = p1; //auto_ptr不会报错.此时不会报错,p2剥夺了p1的所有权,但是当程序运行时访问p1将会报错。所以auto_ptr的缺点是...

C++-智能指针【代码】

目录unique_ptr基本用法std::move*unique_ptrget方法shared_ptr基本用法自定义删除器基础 简单点,不要用指针,用类的实例解决问题 如果要用指针,不要用裸指针,优先考虑unique_ptr,其次是shared_ptr unique_ptr 基本用法 #include <iostream> #include <memory>using std::cout; using std::endl;// 不能拷贝unique_ptr的规则有一个例外:我们可以拷贝或赋值一个将要被销毁的unique_ptr,将亡值std::unique_ptr<int> func1(int ...

【C/C++】指针步长——例题理解【代码】【图】

链接地址:指针步长——例题理解 目录一、例题二、解析 一、例题 下面程序的执行结果: class A{public:long a; }; class B : public A {public:long b; }; void seta(A* data, int idx) {data[idx].a = 2; } int main(int argc, char *argv[]) {B data[4];for(int i=0; i<4; ++i){data[i].a = 1;data[i].b = 1;seta(data, i);}for(int i=0; i<4; ++i){std::cout << data[i].a << data[i].b;}return 0; }A,21212121 B,22221111A和...