指针

C++11 智能指针概述

假装没事ソ 提交于 2020-02-28 05:15:02
0.什么是智能指针? 智能指针是一种用来管理资源指针的特殊对象,对象中有一个成员变量用来保存动态创建的裸指针,通过重载operator->方法实现类似于裸指针的使用方式。 1.智能指针的作用是什么? 我们平时使用C++编写代码时,动态内存管理是我们时刻关注的重点。动态内存管理不好,容易出现下述三类问题: 1、野指针(空悬指针) 一些内存单元已经被释放,但是指向这些内存的指针还在使用,这些已经释放的内存有可能被系统重新分配给应用使用,此时再使用野指针,会造成无法预测的错误。 int *p = new int(10); delete p; // 释放后再次访问,无法预测结果 cout << *p << endl; 2、重复释放 程序试图释放已经被释放的资源,或者已经被重新分配的资源。 int *p = new int(10); delete p; // 重复释放,运行时报错 delete p; 3、内存泄露 不再使用的动态内存没有进行释放,便会造成内存泄露。如果程序多次存在内存泄露行为,会导致内存占用急剧增长,最终程序会因为无法申请到足够的空闲内存而异常退出。 void TestRelease() { int* p = new int(10); // 未释放p return; } 这三类问题严重影响程序的高可用性。但是像JAVA这样的语言不会存在这样的问题

uboot研读笔记 | 05 - 移植uboot 2012.04到JZ2440(支持Nand Flash读写)

别来无恙 提交于 2020-02-28 03:51:09
在支持Nand Flash操作之前,首先要对Nand Flash的读写方法有一定的了解,参考文章: S3C2440-裸机篇-10 | 使用S3C2440操作Nand Flash 1. 去除nand flash屏蔽 在之前初步移植uboot时,发现开启nand flash之后编译不通过,所以屏蔽了nand flash的使用,在单板配置文件 include/configs/smdk2440.h 中开启: 然后编译,改正编译错误。 2. 定位编译出错问题所在 首先来修复第一个问题: 查看s3c2410_nand.c文件的72行: 这个指针有问题的话,就是nand这个结构体变量的定义问题,找到nand变量的定义: struct s3c2410_nand * nand = s3c2410_get_base_nand ( ) ; 接下来问题就变为 struct s3c2410_nand 这个结构体定义有问题,继续寻找该定义,果然,在文件 arch/arm/include/asm/arch-s3c24x0/s3c24x0.h 中,我们定义的是CONFIG_S3C2440,所以有struct s3c2440_nand的定义,没有struct s3c2410_nand的定义: 3. 修复编译错误 — 添加s3c2440_nand.c文件 3.1. 添加文件到工程中 这里涉及到将所有定义全部改变

C++ primer plus

为君一笑 提交于 2020-02-28 03:37:20
给cout指针,默认打印指针地址,但如果指针的类型的char*,将打印指向的字符串,如果要显示的是字符串的地址,将指针强制转换为另一种类型 char* animal cout << animal << endl;//默认显示指针指向的字符串 cout << (int *)animal << endl;//将显示字符串的地址 (int *)animal 显示的是字符串的地址 char * ps; char *animal; ps = animal; 复制的仅仅是地址 需要复制字符串则需要使用strcpy(destination,source); 需要确定的分配了新的空间,能够存储字符串,strlen(sources) + 1确定新开辟的存储空间的大小,new来分配新的动态存储空间; 来源: https://www.cnblogs.com/ruiy/p/7831524.html

20180315 代码错题(10)

冷暖自知 提交于 2020-02-28 00:51:47
下列程序的输出结果是() 10,30,60 20,40,60 10,20,30 10,30,50答案 C  错选 A指向数组的指针即为二级指针 n是一个2行3列的数组,p首先指向n的第一个元素 p[0][0]=n[0][0]=10 p[0]为数组第一行首地址,p[0]+1即为&p[0][1],*(p[0]+1)即为n[0][1]=20 p为二级指针,*p为数组第一行首地址即为p[0],(*p)[2]即为p[0][2]=n[0][2]=30 n[][3] 会确定为 n[2][3] 结构, int(*p)[3] 其中p 的含义是,就是指向一个含有3个元素的数组指针 令p=n,即 p=&n[0] 来源: https://www.cnblogs.com/kxzh/p/8576417.html

C++类的六个特殊成员函数

我们两清 提交于 2020-02-28 00:15:25
1.设置六个函数的参数,先让函数运行起来 // // Created by liuhao on 20-1-1. // #include <iostream> //using namespace std; class Stu { private: std::string name = "无名氏 "; int age = 0; int *d = nullptr; public: Stu() { std::cout << name << age << " 执行了无参构造函数!" << std::endl; }; Stu(int a) { std::cout << name << age << " 执行了有参构造函数!" << std::endl; }; Stu(const Stu &s) { std::cout << name << age << " 执行了拷贝构造函数!" << std::endl; }; Stu &operator=(const Stu &s) { std::cout << name << age << " 执行了拷贝赋值运算符函数!" << std::endl; }; Stu(Stu &&s) { std::cout << name << age << " 执行了移动构造函数!" << std::endl; }; Stu &operator=(Stu &&s) {

部分C2教学笔记(数组指针)

旧时模样 提交于 2020-02-27 23:47:17
C2-01数组知识点 一、声明数组 1.元素的概念 2.Int a[10]四部分 Int——数据类型:元素的数据类型 a——数组名: ① 是一个指针常量而不是变量,值为数组的首地址=&a[0] ② 注意重名问题int a;int a[10]不行 charb[5];floatb[10]不行 10——下标: ① 数组的下标表示:数组中元素个数 ② 数组中元素的下标从0开始 []——下标运算符 3.同时声明多个数组 二、数组的赋值 1.赋值符号赋值,数组的初始化: =与{},二者缺一不可。 两个数之间用,隔开 3+1 种形式 3: 完整 :Int a[10]={1,2,3,4,5,6,7,8,9,10}; 省略下标数 :Int a[]={1,2,3,4,5,6,7,8,9,10}; 省略部分元素 :Int a[10]={1,2,3,4,5,6};只给前6个元素赋值,其余元素赋值为0 (注:只有这里这种情况会默认给没有初值的值赋值为0,只做声明int a[10];不会给整个数 组 都给个0作为初值) 1: (其实属于第三种) 均赋值为0时 Int a[10]={0}; (注意:int a[10]={1};并不会都赋值为1,这属于3+1中3的第三种) 2.输入值:利用for循环cin 三、输出:利用for循环 四、Sizeof(数据类型) 不同的计算机和不同的C编译器下各数据类型所占空间不同

2019学习总结

天大地大妈咪最大 提交于 2020-02-27 22:04:27
一。我学到的内容: 二。我的收获: 编程总结 代码链接 收获 第二周编程总结 https://www.cnblogs.com/xzsx/p/10500432.html 1.定义、运用文件指针;2.文件写入 第三周编程总结 https://www.cnblogs.com/xzsx/p/10539636.html 运用二维数组解决问题, 第四周编程总结 https://www.cnblogs.com/xzsx/p/10579249.html 选择排序法与冒泡排序法 第五周编程总结 https://www.cnblogs.com/xzsx/p/10622242.html 字符串 第六周编程总结 https://www.cnblogs.com/xzsx/p/10654669.html 变量、内存单元和地址之间的关系;定义指针变量,指针变量的初始化 第七周编程总结 https://www.cnblogs.com/xzsx/p/10696520.html 字符串和字符指针、 第八周编程总结 https://www.cnblogs.com/xzsx/p/10738426.html 掌握常用字符串函数以及使用指针操作字符串的方法,掌握动态内存分配 第九周编程总结 https://www.cnblogs.com/xzsx/p/10774548.html 掌握结构指针操作,运用结构数组与结构变量编程

第十次实验总结

╄→гoц情女王★ 提交于 2020-02-27 20:47:30
知识点总结: 1.这周新开的章节是指针。 对于指针变量 ·一般形式:类型名 *指针变量名; ·定义指针变量要使用指针声明符*; 例如:int i,*p; (声明变量i是int类型,变量p是指向int型变量的指针。指针值可以是特殊的地址0,也可以是一个代表机器地址的正整数。) ·定义多个指针变量时,每一个指针变量前面都必须加上*; 注:指针变量的类型不是指指针变量本事的类型,而是指它所指向的变量的数据类型。无论何种类型的指针变量,它们都是用来存放地址的,因此指针变量自身所占的内存空间大小和它所指向的变量数据类型无关,尽管不同类型的变量所占的内存空间不同,但不同类型指针变量所占的内存空间大小都是相同的。 ·指针变量被定义后,必须将指针变量和一个特定的变量进行关联后才可以使用它,也就是说,指针变量也要先赋值再使用,当然指针变量被赋的值应该是地址。 ·定义指针变量:指针变量名是一个标识符,要按照c标识符的命名规则对指针变量进行命名。指针变量的数据类型是它所指向的变量的类型,一般情况下一旦指针变量的类型被确定后,它只能指向同种类型的变量。在定义指针变量是需要使用指针声明符*,但指针声明符并不是指针的组成部分。例如:定义 int *p;说明p是指针变量,而不是*p。 2.指针的基本运算 ·取地址运算和间接访问运算:单目运算符&用于给出变量的地址。(指针的类型和它所指向变量的类型必须相同)

KMP模式匹配算法

↘锁芯ラ 提交于 2020-02-27 20:07:01
title: KMP模式匹配算法 date: 2020-02-26 17:24:29 tags: datastructure 这几天复习到数据结构的串的模式匹配,看到KMP算法那么寥寥几行的代码,原本觉得这部分内容很简单,直到我开始尝试去理解它,我才发现我跟大佬的差别。 KMP算法的基本思路 KMP算法,是名分别为K、M、P的三个美国大佬发明的,算是对传统的朴素模式匹配算法的改进。我们先规定,讨论模式串下标均从1开始。朴素模式匹配算法就不谈了,这个有脑子就能想出来,但朴素模式匹配算法存在一个弊端——当模式串有较多重复元素存在时,主串指针i其实做了很多没有必要的回溯。 而如果想跳过这些没有必要比较的情况,那么就可以想到,主串指针是没有必要回退的,因为当发生与模式串失配的情况时,可以确定的是,此前成功匹配的若干元素形成的字串,其实就是模式串的一个真字串,那么对于这样的一个字串,它的头部和尾部如果发生了重复,就只需要往回移动模式串指针就好了,但是又不需要往回移到初始位置,因为我们看到他的头部和尾部发生了重复,又由于这个头部重复的部分与现在主串指针前的那个模式串真字串重复,而这部分就是真字串的尾部,所以最有利的做法应该是将模式串指针移动至头部重复字串的后一位,再来与当前的主串指针比较。这样,就避免了主串的回溯,单就这个算法本身,简单来看时间复杂度应该是o(n)。 以下是KMP主代码

C基础(2)

巧了我就是萌 提交于 2020-02-27 19:03:54
一、指针 指针是一个unsigned类型的整数。 指针变量由于存放指针。 指针变量的加减法是针对基类型而言的 eg int *p; p+1所指的是下一个int型变量 注意:指针减法的结果是相差了几个基类型 如 q = 2068708,p = 268688;q-p = 5; 二、引用 引用是C++的语法。 注意: 区分引用和取地址。 常量不能使用引用。 交换的几种错误: void swap(int *a,int *b){ int* temp; *temp = *a; *a = *b; *b = *temp; } //错误原因:未初始化temp void swap(int *a,int *b){ int* temp = a; a = b; b = temp; } //错误原因:传入的a,b只是地址的副本,类似无符号整型数 void swap(int* &a,int* &b){ int* temp = a; a = b; b = temp; } //正确,利用引用来交换值 三、结构体 struct a{ … }b,c; a是结构体名字,b,c是变量名 C++构造函数: struct student{ int id; char gender; student(){}//默认构造函数 } struct student{ int id; char gender; student(int _id