指针

iOS开发之block解析

故事扮演 提交于 2020-02-05 22:04:57
1. block的本质是一个Objective-C的对象,为什么这么说? 在Objective-C中,runtime会在执行时依据对象的isa指针的指向,来度额定这个对象的类型,也能够觉得一个对象,它具有isa指针,就是一个OC对象 2. 你怎么知道block有isa指针呢,我们能够通过clang命令将来看block的实现 //測试代码 int main(int argc, const char * argv[]) { @autoreleasepool { void(^blk)(void)=^{ NSLog(@"hello lx"); }; } return 0; } 转化后:block语法被编译器转化成了以下的结构 struct __main_block_impl_0 { struct __block_impl impl;//block实现的相关信息 struct __main_block_desc_0* Desc;//block的描写叙述信息 __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) { impl.isa = &_NSConcreteStackBlock; impl.Flags = flags; impl.FuncPtr = fp; Desc = desc; } };

初识java

ぃ、小莉子 提交于 2020-02-05 20:50:07
一。 安装JDK 和配置环境变量 JDK是java的开发工具包 JRE是java的运行环境 以.java结尾的文件 被叫做源代码文件 主要用于进行编码 以.class 结尾的文件 叫字节码文件 主要作用:用于虚拟机执行的程序文件 常用的jdk工具 -----bin 数据库的相关目录 ----db C语言的相关程序 ----include Jdk的内部运行环境 —jre 支持jdk的相关的工具 —lib 例如dt.jar tools.jar src.zip源码包 —提供源码的查看 public 公共的 访问修饰符 *class 类 类的名称 HelloWorld *static 静态 *void 没有返回值的 main 主函数的固定名称 // 单行注释 /* 多行注释 */ /** 文档注释 */ 注意:写代码一定要写注释 二。 数据类型: 基本数据类型 数值型:byte short int long 浮点型:float double 字符型:char 布尔类型:boolean 小类型可以自动转换成大类型 大类型转小类型要进行强制转换 变量所承载的内容是计算机的一些相关数据,一般存储在内存中 在java中定义有两种 局部变量:在方法中定义的变量 作用域:方法中访问 成员变量: 在类的里面方法外面定义的变量 作用域:在类中可以访问 命名规范: 一般情况下 类名和要文件名相同 首字母大写

牛客网 —— 腾讯2017校招开发工程师笔试试卷(二)

落花浮王杯 提交于 2020-02-05 20:31:19
链接: https://www.nowcoder.com/test/6393508/summary 第一题:Linux进程通信方式: 套接字(网络通信),信号量,管道(PIPE),共享内存,FIFO(命名管道),信号(signal),文件锁。 第二题: 区分数组指针和指针数组: 数组指针:int *p[4]; 从右往左理解,因为[4],所以是一个数组,然后是int*,说明内部的元素是4个int指针。 (中文名字本质在左边,看代码本质在右边) 指针数组:int (*p)[4]; 因为有括号,所以说明它是一个指针,然后再从右往左理解。 (其实,最正规的理解是看运算符的优先级, [] > *) 因为本题本指针数组,所以该指针指向的数组每个元素都是长度为4的数组。m为{{1,2,3,4},{5,6,7,8},{9,0, , }}。 第三题:银行家算法用于避免死锁。 (有关于死锁的部分,概念可以完全去学习一下) 第七题:待会再学。 第12题:64位系统,32位系统:CPU一次处理的位数,寄存器的位数也和这个位数一致。 对于MAR,他也是一个寄存器,因此CPU处理字长决定了虚拟地址的长度,因此,指针的长度也会因此改变,在64位系统中为8B,在32位系统中为4B。 (因此,对于32位系统的计算机而言,超过4G的内存就没有必要了。) 第13题:空类求sizeof为1

C++ this指针

不羁的心 提交于 2020-02-05 14:52:16
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。 this作用域是在类内部,当在类的 非静态成员函数 中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个 隐含参数 传递给函数。 this指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中,指向被调用函数所在的对象。 全局仅有一个this指针,当一个对象被创建时,this指针就存放指向对象数据的首地址。 实例: #include<iostream> using namespace std; 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+=b; } void print() { cout<<"x="<<x<<"y="<<y<<endl; } }; int main() { Point point1(10,10); point1.MovePoint(2,2); point1.print(); return 0; } 当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。 MovePoint函数的原型应该是 void MovePoint(

非递归全排序(非字典算法)

假装没事ソ 提交于 2020-02-05 13:30:46
非c++ next_permutation方式 数组不可有重复值(等待改进中) 思路: nums = [1,2,3, 4] 先建立空lists 数量为n! = 4! = 24 [ [], [], [], . . . ] sPtr = 0 [1, 2, 3, 4] 3!=6次插入nums[sPtr]后,指针sPtr后移(超出回归0) [ 1 , // sPtr = 0 1 , 1 , 1 , 1 , 1 , 2 , // sPtr = 1 … … … ] [1, 2, 3, 4] 插入前检测nums[sPtr] 是否已存在当前list中,是则指针sPtr后移(超出回归0) 2!=2次插入nums[sPtr]后,指针sPtr后移(超出回归0) [ [ 1 , 2 // sPtr = 1 1 , 2 1 , 3 // sPtr = 2 1 , 3 1 , 4 // sPtr = 3 1 , 4 … // sPtr = 0 … … ] [1, 2, 3, 4] 插入前检测nums[sPtr] 是否已存在当前list中,是则指针sPtr后移(超出回归0) 1!=1次插入nums[sPtr]后,指针sPtr后移(超出回归0) [ 1 , 2 , 3 1 , 2 , 4 1 , 3 , 2 1 , 3 , 4 1 , 4 , 2 1 , 4 , 3 … … … ] [1, 2, 3, 4]

小白学Java:RandomAccessFile

杀马特。学长 韩版系。学妹 提交于 2020-02-05 12:17:09
目录 小白学Java:RandomAccessFile 概述 继承与实现 构造器 模式设置 文件指针 操作数据 读取数据 read(byte b[])与read() 追加数据 插入数据 前文传送门: 小白学Java:I/O流 小白学Java:RandomAccessFile 之前我们所学习的所有的流在对数据操作的时候,都是只读或者只写的,使用这些流打开的文件很难进行更新。Java提供了 RandomAccessFile 类, 允许在文件的任意位置上进行读写 。 概述 官方文档的解释是这样的: Instances of this class support both reading and writing to a random access file. 支持对文件进行读写 ,可以认为这是一个双向流。 A random access file behaves like a large array of bytes stored in the file system. 在操作文件的时候,将文件看作一个 大型的字节数组 。 There is a kind of cursor, or index into the implied array, called the file pointer ; input operations read bytes starting at the file

c++数组与指针知识集锦

风格不统一 提交于 2020-02-05 09:24:49
1、 // by 鸟哥 qq1833183060 数组与指针 # include <iostream> using std :: cout ; int main ( ) { int a [ 10 ] { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } ; int j = 6 ; cout << a [ j ] << " " << * ( & a [ 0 ] + j ) << " " << * ( a + j ) << " " << * ( j + a ) << " " << j [ a ] << std :: endl ; } //输出为 7 7 7 7 7 运行结果: 7 7 7 7 7 来源: CSDN 作者: 鸟哥01 链接: https://blog.csdn.net/sinat_18811413/article/details/104138046

C++的指针和引用的区别

拜拜、爱过 提交于 2020-02-05 09:03:02
编译器一般会将引用实现为const指针, 所以可以将引用看做是一种特殊的指针 一.引用和指针的不同点 引用必须进行初始化,不存在对于空对象的引用,指针可以为空,指向空对象 # include <iostream> using namespace std ; int main ( ) { int * a ; int & b ; return 0 ; } 编译运行之后会报错 使用指针之前必须进行判空操作,引用就不用判断 引用和指针的"++"操作不一样,指针会改变指向,引用会改变所指向的对象内容 # include <iostream> using namespace std ; int main ( ) { int i = 10 ; int & ref = i ; ref ++ ; std : : cout << "i=" << i << endl ; std : : cout << "ref=" << ref << endl ; ref = 20 ; ref ++ ; std : : cout << "i=" << i << endl ; std : : cout << "ref=" << ref << endl ; return 0 ; } sizeof 引用 得出来是所指向的对象的值,sizeof 指针得出来的是指针的大小 # include <iostream> using

第3章 栈和队列

。_饼干妹妹 提交于 2020-02-05 09:01:48
3.1 栈的定义及抽象数据类型 栈(stack)是一种特殊的线性表,这种表只能在固定的一端进行插入与删除运算。通常称固定插入、删除的一端为栈顶(top),而另一端称为栈底(bottom)。位于栈顶和栈底的元素分别称为顶元和底元。当表中没有元素时,称为空栈。为了与一般的线性表相区别,通常将栈的插入操作称为入栈,将删除操作称为出栈。 线性表S=(a,b,c,d,e) 将S中的元素按照a、b、c、d、e的顺序依次入栈,则出栈的元素顺序为e、d、c、b、a 可以发现,最先进入栈中的元素a最后才出栈,最后入栈的元素e最先被出栈,因为栈的这一特性,故又将其称为后进先出的线性表(lastinfirstout,简称为LIFO)。 3.2 栈的实现 栈的实现既可以采用顺序存储结构也可以采用链式存储结构。采用顺序存储结构实现的栈称为顺序栈,采用链式存储结构实现的栈称为链栈 3.2.1 顺序栈 栈的初始化操作是指按指定的大小为栈动态分配一片连续的存储区,并将该存储区的首地址同时送给栈顶指针top和栈底指针base,表示栈里没有任何元素,此时的栈为空栈。若base的值为NULL时则表明栈不存在。当插入一个新元素时栈顶指针加1,当删除一个元素时栈顶指针减1。栈顶指针top始终比顶元超前一个位置,因此栈满的条件是top-base=stacksize。图3-3所示为栈顶指针和栈中元素的关系。 值得注意的是

C++多态的实现

冷暖自知 提交于 2020-02-05 06:34:10
文章目录 C++如何实现多态? 简单的回答 C++虚指针与vtbl 参考 C++如何实现多态? 简单的回答 通过动态绑定实现的 而动态绑定的话,又是通过vptr(指向虚表的指针)、vtbl(虚表)。 C++虚指针与vtbl https://www.cnblogs.com/fenglongyu/p/7385056.html 参考 https://blog.csdn.net/zyq0335/article/details/7657465 来源: CSDN 作者: 代码人老周 链接: https://blog.csdn.net/qq_16761099/article/details/102979533