指针变量

指针函数和函数指针

前提是你 提交于 2020-01-28 16:50:46
指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。 函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。 int * fun ( int x , int y ) ; //指针函数 int ( * fun ) ( int x , int y ) ; //函数指针 来源: CSDN 作者: 蒋文韬 链接: https://blog.csdn.net/qq_34591581/article/details/104100252

微软向开源又迈进了一大步:Checked C

假装没事ソ 提交于 2020-01-28 11:31:03
导读 微软开源了 Checked C ,这是一个 C 语言的扩展版本,可以用于解决 C 语言中的一系列安全相关的隐患。正如其名字所示,Checked C 为 C 语言增加了检查,这个检查可以帮助开发者检查常见的编程错误,比如缓存区侵占buffer overruns、内存访问越界、不正确的类型转换等。这些编程错误往往是造成许多重大安全漏洞的根本原因,比如破壳漏洞Shellshock、心脏出血漏洞Heartbleed、沙虫Sandworm等。 Checked C 通过修改控制指针来解决这些问题,指针被程序员们用来定义他们的代码所操作的内存地址。当指针数量一多,指针控制就往往容易忙中出乱,项目越大跟踪它们就越困难,类似 Chromium、Firefox、Office、OpenSSL 以及其它的大型代码库在这方面都存在这样的问题,你可以从它们的变更日志中看到大量的这类问题修复。“Checked C 允许程序员更好的描述他们想要如何使用指针,以及指针应该指向的内存范围”,微软说,“这个信息可以用于在运行时环境中添加检测,以侦测错误的数据访问,而不是让错误悄悄的发生而无所察觉。” Checked C 也将允许开发者检测到他们以为 C 语言有、而实际却没有的功能误用。按编程界的说法来讲,这个叫做“边界检查bounds checking”的功能,用于检查变量/指针是否在它的范围之内赋值,C# 和

C++ primer 笔记(一)

。_饼干妹妹 提交于 2020-01-28 08:22:47
第1章 >> << 输入输出操作符返回 输出流std::cin, std::cout本身 endl输出换行,刷新与设备关联的buffer augument 实参 paremeter 形参 buit-in type 内置类型 manipulator 操纵符 第2章 C++是静态类型语言,编译时执行类型检查 wchar_t =L'a' 16位 float 6位有效数字 double 至少10位有效数字 long double 至少10位有效数字 赋值:对于unsigned越界赋值,结果等于该值对unsigned可能取值个数求模 例如:unsigned char c=336; //实际c=336%256=80 unsigned char c=-1; //实际c=-1%256=255 对于signed越界赋值,由编译器决定实际值 初始化不是赋值,初始化指创建变量并赋值,赋值是擦出当前值赋新值 内置类型初始化:在函数体外定义的变量初始化为0,函数体内定义的不自动初始化。 定义:分配存储空间,还可以指定初值 声明:向程序表明变量的类型,名字 extern声明:当有初始化式时则为定义 非const变量默认为extern,要使const变量能在其他文件中访问,则需显式指定为extern。const默认为定义它的文件的局部变量。 引用必须在定义时初始化,引用一经初始化,就始终指向同一个特定对象。

使用双指针可能只需要遍历一趟哦(洛谷P1147题题解,Java语言描述)

好久不见. 提交于 2020-01-27 14:57:51
题目要求 P1147题目链接 分析 Java没有指针的概念,但我们也不是用的C的指针。这里的指针是指两个数值,代表区间的两个索引,利用双指针的移动表示区间的收缩或者扩张,借此找到所求的解。 我们定义两个int变量 i 和 j 来代表一个区间左右边界的索引 tempSum是指当前区间内所有数值的和。 当tempSum小于目标值M时,将右端点右移(j++),然后改变tempSum的值,即tempSum会变大; 当tempSum大于目标值M时,将左端点右移(i++),然后改变tempSum的值,即tempSum会变小。 在双指针移动的过程中,如果有tempSum==M的情况就将其添加到List里面,等最后输出。 因为两个指针整体是向右移动,也只扫一遍,效率比较高。 左端点大于m/2时就停止,因为只要长度为2的连续序列和就一定大于m,肯定不符合要求,不必浪费时间。 具体的设计还是需要仔细看的: AC代码(Java语言描述) import java . util . LinkedList ; import java . util . List ; import java . util . Scanner ; public class Main { public static void main ( String [ ] args ) { Scanner scanner = new

虚拟机的共享文件夹设置

有些话、适合烂在心里 提交于 2020-01-27 04:30:10
文章目录 .c文件的编译和执行 共享文件夹 进阶 基本数据类型 内存占用和sizeof 全局变量 局部变量和全局变量的对比 常量 枚举常量 多文件 头文件 指针 指针与++-- .c文件的编译和执行 编译 gcc -o 生成文件名 .c文件名 gcc .c文件名 -o 生成文件名 使用-o选项就可以生成指定名称的可执行文件 gcc .c文件名 默认生成一个a.out的文件 执行 ./可执行文件 共享文件夹 一般使用Windows编辑源代码,使用Linux进行编译和执行,这时候就要进行交互 如何进行交互? 使用网络,smb服务器(现在不怎么常用) 使用共享文件夹 共享文件夹的创建 首先要安装增强功能 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ekFeqHfd-1577786732784)(en-resource://database/8838:1)] 安装总是无法发送虚拟光驱……到虚拟电脑? 这个时候要弹出光驱然后再次点击安装增强功能就OK了 如何弹出?(19的在没有虚拟光驱的图标,所以要这样做) [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dnV2Vyp7-1577786732786)(en-resource://database/8840:1)] 那个移除虚拟盘就是,不过要先勾选上Ubuntu…

C++基础

会有一股神秘感。 提交于 2020-01-26 23:19:36
基本数据类型 数据类型 位数 字节数 值域 signed char 8 1 -128~+127 usigned char 8 1 signed short 16 2 unsigned short 16 2 signed int 16 2 unsigned int 16 2 signed long 32 4 unsigned long 32 4 float 32 4 double 64 8 运算符 略 流程控制 if - else for 循环 while do while 指针 指针的定义: int * pl ; 指针变量的赋值 int a ; int * pl ; // *此处用作类型声明 pl = & a ; // &取地址运算符 指针的运算 int a , b ; int * pl ; // 指针类型 pl = & a ; // 取地址 a = 80 ; b = * pl ; // 取内容 int a [ 5 ] ; int * pl ; pl = & a ; // pl 为 a[0] pl = pl + 2 ; // pl 为 a[2] void指针类型 可以把任何类型的指针赋值给void 结构体 struct student { int a ; int b ; int c ; } ; struct student { . . . . . . . . . } ;s1

智能指针

人盡茶涼 提交于 2020-01-26 22:31:48
内存泄露(臭名昭著的BUG) 动态申请堆空间,用完后不归还 C++语言中没有垃圾回收机制 指针无法控制所指堆空间的生命周期 我们需要什么? 需要一个特殊的指针 指针生命周期结束时主动释放堆空间 一片堆空间最多只能由一个指针标识 杜绝指针运算和指针比较(可以避免野指针) 解决方法 指针操作符(->和*) 只能通过类的成员函数重载 重载函数不能使用参数 只能定义一个重载函数 小结: 指针操作符(->和*)可以被重载 重载操作符能够使用对象代替指针 智能指针只能用于指向堆空间的内存 智能指针的意义在于最大程度的避免内存问题 智能指针使用军规:只能用来指向堆空间中的对象或者变量 #include <iostream> #include <string> using namespace std; class Test { int i; public: Test(int _val) { this->i = _val; cout << "Test(int _val)" << endl; } ~Test() { cout << "~Test()" << endl; } int get_value() { return i; } }; class Pointer { Test* mp; public: Pointer(Test *p = NULL) { mp = p; } //执行深拷贝

x264阅读记录-1

*爱你&永不变心* 提交于 2020-01-26 17:41:48
x264阅读记录-1 采用x264版本是x264-snapshot-20060316-2245。 1. main函数 x264的main函数位于x264.c中,下面是main函数调用情况: (1)_setmode函数和_fileno函数 这两个函数是微软提供的两个库函数。 _setmode函数位于io.h文件中,主要作用是设置特定模式匹配的文件。http://msdn.microsoft.com/zh-cn/library/vstudio/tw4k6df8.aspx _fileno函数位于stdio.h文件中,用于获取文件流所对应的描述符。http://msdn.microsoft.com/zh-cn/library/vstudio/zs6wbdhx.aspx 下面的语句主要实现的是将Windows下默认的Text模式,按需要设置为BINARY模式, _setmode ( _fileno ( stdin ), _O_BINARY ); 还有一点,这个语句位于预编译命令中,其中涉及到一个宏 _MSC_VER。这个宏是VC编译环境的预定义宏,主要是计算为编译器的主版本号和次版本号元素。 专业数字为句点分隔的版本号的第一个元素,并且该次版本号是第二个元素。 因此,如果Visual C++编译器的版本号为15.00.20706.01,_MSC_VER 宏计算结果为1500。在 Visual

指针的指针

最后都变了- 提交于 2020-01-26 15:44:52
如果要改变实参的值,就传入实参的地址,当我们需要改变指针所指向的地址时,我们就需要指针的指针; 下边我们看一个实例: # include <iostream> # include <string.h> using namespace std ; void address ( char * * p ) { * p = ( char * ) malloc ( 100 ) ; } int main ( ) { char * pointer = NULL ; address ( & pointer ) ; strcpy ( pointer , "Hello,world." ) ; cout << pointer << endl ; return 0 ; } 首先定义一个空指针用于存放字符串,然后使用malloc函数开辟一个长度为100字节的内存空间,使该指针指向它 * p在本质上还是一个指针,malloc函数返回的就是一个指针变量!这里为什么不直接用一个指针是因为要改变实参pointer,要改变实参必须传入实参的地址. 来源: CSDN 作者: M’s Friday 链接: https://blog.csdn.net/Cloud_1234_5678/article/details/103605504

this指针(待完善)

情到浓时终转凉″ 提交于 2020-01-26 14:55:31
1. this 指针的用处:    一个 对象 的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候, 编译器 会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。   例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 . 2. this 指针的使用:   2.1 一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;   2.2 另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。 3. this 指针程序示例:   this指针存在于 类的成员函数 中,指向被调用函数所在的类实例的地址。    #include<iostream.h>    class Point    {    private:    int x, y;    public:    Point(int a, int b) { x=a; y=b;}    void MovePoint( int a, int b){ x+=a; y+