指针变量

delphi 函数指针

半城伤御伤魂 提交于 2020-02-19 17:36:52
Pascal 中的过程类型与C语言中的函数指针相似 ,为了统一说法,以下称函数指针。函数指针的声明只需要参数列表;如果是函数,再加个返回值。下面讲解指向非对象(一般的)函数/过程的函数指针。 例如声明一个过程类型,该类型带一个通过引用传递的整型参数: type IntProc = procedure (var Num: Integer); // IntProc是指向过程的函数指针 这个过程类型与任何参数完全相同的例程兼容,即用它声明的变量,可以指向任何此类函数,并通过其进行函数的调用。 下面是一个兼容例程: procedure DoubleTheValue (var Value: Integer); begin Value := Value * 2; end; 函数指针能用于两种不同的目的:声明函数指针类型的变量;或者把函数指针作为参数传递给另一例程。利用上面给定的类型和过程声明,你可以写出下面的代码: var IP: IntProc; X: Integer; begin IP := DoubleTheValue; X := 5; IP (X); end; 虽然这种调用方法比直接调用麻烦了,那么我们为什么要用这种方式呢? (1)因为在某些情况下,调用什么样的函数需要在实际中(运行时)决定,你可以根据条件来判断,实现用同一个表达,调用不同的函数,很是灵活. (2

单向环形链表 约瑟夫问题

孤者浪人 提交于 2020-02-19 09:08:56
Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。 链表如下图 数2下 自己也要数 所以只会移动1次 构建链表,遍历链表 分析图 first.next = 2 3.next = first 让最后一个元素的next指向first 首先 创建一个环形链表 // 创建一个first节点,当前没有编号 private Boy first = null; // 添加小孩节点,构建成一个环形的链表 public void addBoy(int nums) { // nums 做一个数据校验 if (nums < 1) { System.out.println("nums的值不正确"); return; } Boy curBoy = null; // 辅助指针,帮助构建环形链表 // 使用for来创建我们的环形链表 for (int i = 1; i <= nums; i++) { // 根据编号,创建小孩节点 Boy boy = new Boy(i); // 如果是第一个小孩 第一次 if (i == 1) { first = boy; //这是头指针 把第一个的赋值给first //不太理解

【Lintcode】415. Valid Palindrome

你。 提交于 2020-02-19 07:13:18
题目地址: https://www.lintcode.com/problem/valid-palindrome/description 给定一个字符串,只考虑字母和数字,字母忽略大小写区别,忽略所有其他字符,问该字符串是否回文。直接对撞双指针,左指针持续右移直到遇到字母或数字,右指针持续左移直到遇到字母或数字,如果指到的两个字符忽略大小写后不等,就直接返回false。循环结束后返回true。 public class Solution { /** * @param s: A string * @return: Whether the string is a valid palindrome */ public boolean isPalindrome ( String s ) { // write your code here // 判空 if ( s == null || s . isEmpty ( ) ) { return true ; } // 开两个变量做左右指针 int i = 0 , j = s . length ( ) - 1 ; while ( i < j ) { // 注意循环的时候一定要保持左右指针没有交错过去 while ( i < j && ! Character . isLetterOrDigit ( s . charAt ( i ) ) ) { i ++

C++笔记(from B站玄马科技)

你。 提交于 2020-02-19 04:32:29
地址: https://space.bilibili.com/477729104 bool类型 C++中的新类型(bool:0为假,非0为真) 占用的字节数(bool:1,BOOL:4) bool类型正确的使用 const常量 const用于修饰变量,将变量变为常量(常量一旦定义,就不可以修改) 编译器在程序的编译时期做的检查 默认参数 函数允许提供默认参 默认参可以写在声明或者定义处,但只能出现在一个地方,一般写在声明处 当一个参数有默认参时,该参数的右边必须都出现默认参 使用宏定义 #define TESTFoo(m,n,k) TestFoo(m,n,k,1,2,3) int TestFoo(int n1, int n2, int n3, int n4, int n5, int n6) { return 0; } 此时,TestFoo内n4, n5, n6的值将会被宏定义中的1,2,3所代替。 也可以采用以下方式 #define TESTFoo(m,n,k) TestFoo(m,n,k,1,2,3) int TestFoo(int n1, int n2, int n3, int n4 = 4, int n5 = 5, int n6 = 6) { return 0; } 此时,n4, n5, n6的值将由函数内部的形参决定,即值为4,5,6 当采用以下方式时 #define

2020/2/18-C语言复习-字符串与指针

无人久伴 提交于 2020-02-18 21:27:03
C语言复习-字符串与指针 例一: 【字符串处理 去除C代码中的注释】      C/C++代码中有两种注释,/* */和//。编译器编译预处理时会先移除注释。就是把/*和*/之间的部分去掉,把//以及之后的部分删掉。这里约定,如果出现了/* AAAA /* BBBB */的情况,也就是/**/中出现了/*,那么第二个/*是不当作注释起始的。编写函数void removeComment(char *str)。    分析:对于字符串”int c=4,/*c累计量*/ a=3;/*变量*/ // a初值为3 ”先用 strstr函数 在str中确认”/*” 是否出现过,是则再确认”*/” 是否出现过,是则 把str中自”*/”出现位置后2个字符起始的字符串复制到str中”/*”开始的位置,覆盖掉注释部分。 循环查找直到找不到”/*”为止;再用strstr在str中确认”//” 是否出现过,是则 把出现”//”的位置上置为’\0’ 。 #include <stdio.h> #include <string.h> void removeComment(char *str) { char *p=str, *q; while ((p=strstr(p, "/*")) != NULL) { q=strstr(p, "*/"); if (q != NULL) strcpy(p, q+2); } p

Delphi 记录类型- 结构指针

若如初见. 提交于 2020-02-18 09:46:53
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class (TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); end ; var Form1: TForm1; implementation { $R *.dfm } type TRec = record { 定义结构 TRec } name: string [ 12 ]; age: Word; end ; TPRec = ^TRec; { 定义 TRec 结构的指针类型 TPRec } var Rec: TRec; { 声明结构变量 } PRec1,PRec2: TPRec; { 声明

opencv 2 computer vision application programming第二章翻译

醉酒当歌 提交于 2020-02-18 08:27:46
第二章 操作像素 在本章,我们会讲述: 处理像素值 用指针扫描图像 用迭代器扫描图像 写高效的图像扫描循环 用相邻的方法扫描图像 展示简单的图像计算 定义感兴趣的区域 【概述】 为了建立计算机图像应用,你必须能够接触图像内容,并且最终修改或者创建图像。这一章中会教你如何操作图像元素,比如像素。你会学 习到如何扫描一幅图像并处理每个像素点。你也会学习到如何高效地做,因为就算是适当的维度的图像也会包含成千上万的像素的。 基本上将,一个图像时一个数值对应的矩阵。这就是OpenCV2用cv::Mat处理图像的原因了。矩阵中的每一个元素代表一个像素。对于一个灰 度图像(黑白图像),像素值是8位的无符号型值(也就是非负数。。),相应地,0代表黑色而255代表白色。对于彩色图像,每个像素的三 个这样的值代表着我们常常说的三原色(红,绿,蓝)。此时一个矩阵元素由三个值生成。 正如前面所讲,OpenCV也允许你用不同类型的像素值创建图像,比如CV_8U或者浮点值CV_32F。这些对于存储很有用的,例如在一些图像处理 过程中的起到媒介作用的图像。大多数操作可以被应用到任何类型的矩阵上,其他的则是需要特定的类型,或者只能和给定数量的通道数量 起作用。所以说,为了避免在编程中犯常见错,对于一个函数或者方法的前提的理解是很重要的。 整个这一章节,我们用如下的一张图片作为输入图片。 【处理像素值】

STL笔记(3)- Effective STL

大兔子大兔子 提交于 2020-02-18 07:35:11
Effective STL 1: 慎重选择容器类型 2: 不要试图编写独立于容器类型的代码 3: 确保容器中的对象 copy 正确且搞笑 存在继承关系时的 copy 会导致分割 , 可以存储对象指针 . 4: 调用 empty 而不是检查 size() 是否为 0 empty 对所有标准容器是常数时间操作 . size() 返回容器元素个数 , 耗费线性时间. capacity() 返回能够存储的总数 , 对于 vector(type) c, capacity 为 0, 不能赋值 , 必须用 reserve 分配空间 . 5: 区间成员函数优先于与之对应的单元素成员函数 . 避免写显示循环 , 这样减少对象拷贝 , 减少代码 . 1 vector<int> v1, v2; 2 3 //... 4 5 v1.clear(); 6 7 for(vector<int>::const_iterator ci = v2.begin(); ci != v2.end(); ++ci) 8 9 {10 11 v1.push_back(*ci);12 13 }14 15 相当于16 17 v1.assign(v2.begin(), v2.end());18 19 而算法 copy(v2.begin(), v2.end(), back_inserter(v1)); 中尽管没有显示循环 , 但是

【C语言】- 指向一维数组元素的指针!学习不需要带口罩,只要带脑子

 ̄綄美尐妖づ 提交于 2020-02-17 22:47:46
前面我们已经学习了指针,如果指针存储了某个变量的地址,我们就可以说指针指向这个变量。数组及其数组元素都占有存储空间,都有自己的地址,因此指针变量可以指向整个数组,也可以指向数组元素。 一、用指针指向一维数组的元素 输出结果: 说明已经通过指针间接修改了数组元素的值,跟指向一个普通int类型变量是一样的。 由于数组名代表着数组的首地址,即a == &a[0],因此第8行代码等价于: // 让指针指向数组的第0个元素 p = a; 内存分析图如下,一个指针变量占用2个字节,一个int类型的数组元素占用2个字节 二、用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 输出结果: 2.接下来我们用指针来遍历数组元素 先定义一个指针,指向数组的第一个元素 p的值是a[0]的地址,因此,现在我们利用指针p只能访问数组的第0个元素a[0],用*p就可取出a[0]的值1。要想访问其他元素,就必须拿到元素的地址,可以发现每个元素的地址差值为2,因为在16位编译器环境下,一个int类型的变量占用2个字节。现在只是知道a[0]的地址值为p,怎么根据a[0]的地址获取其他元素的地址呢?其实非常简单,p+1就是a[1]的地址。注意了,这里的p+1代表着p的值加2,并不是p的值加1,比如p的值为ffc3,p+1则为ffc5,而非ffc4。依次类推,p+2就是a[2]的地址ffc7,p+3就是a[3

我的大厂面试经历

被刻印的时光 ゝ 提交于 2020-02-17 17:31:41
2020-02-17 10:53:03 在这里提供一下自己复习的东西吧,我也就把这个东西给搞了一遍,然后面试基本没啥问题了,如果问的很深的话,那就只能只求多福了兄弟!其中可能有一些错误或者由于编译环境有差异请大家自动忽略这些错误。 1:信号的生命周期? 信号产生-》信号在进程中注册-》信号在进程中的注销-》执行信号处理函数 2:信号的产生方式? (1)当用户按某些终端键时产生信号(2)硬件异常产生信号【内存非法访问】(3)软件异常产生信号【某一个条件达到时】(4)调用kill函数产生信号【接受和发送的所有者必须相同,或者发送的进程所有者必须为超级用户】(5)运行kill命令产生信号 3:信号处理方式? (1)执行默认处理方式(2)忽略处理(3)执行用户自定义的函数 4:如何消除隐式转换? 使用explicit关键字进行修饰 5:重载,重写和隐藏的区别? 重载:即函数重载 重写【覆盖】:即用于虚函数 隐藏:只要派生类的函数名与基类相同就会隐藏 6:volatile表示什么?有什么作用? 易变的,不会被编译器进行优化,让程序取数据直接去内存中的。 7:Static_cast<>,dynamic_cast<>,const_cast<>,reinterpret_cast<>的各自作用和使用环境? Static_cast:能完成大部分转换功能,但是并不确保安全 Const_cast