指针变量

typedef函数指针用法

安稳与你 提交于 2020-02-29 16:45:49
1.简单的函数指针的应用 形式1:返回类型(*函数名)(参数表) [cpp] view plain copy char (*pFun)( int ); char glFun( int a){ return ;} void main() { pFun = glFun; (*pFun)(2); } 第一行定义了一个指针变量pFun。首先我们根据前面提到的“形式1”认识到它是一个指向某种函数的指针,这种函数参数是一个int型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。 第二行定义了一个函数glFun()。该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址 然后就是main()函数了,它的第一句您应该看得懂了——它将函数glFun的地址赋值给变量pFun。main()函数的第二句中“*pFun”显然是取pFun所指向地址的内容,当然也就是取出了函数glFun()的内容,然后给定参数为2。 2.使用typedef更直观更方便 形式1:typedef 返回类型(*新类型)(参数表) [cpp] view plain copy typedef char (*PTRFUN)( int ); PTRFUN pFun; char glFun( int a){

C++程序运行时内存布局之--this到底是什么?

扶醉桌前 提交于 2020-02-29 16:38:31
先问一个问题,在C++里,成员函数里的this指针和调用此函数的对象地址总是一样的吗?如果你的回答是:不一定。那么至少你是个老手吧,下面的内容你就不用看了;如果你的回答是:是啊,那么强烈建议你看看下面的内容。 非静态成员函数,无论是不是虚函数,都隐藏了一个this指针参数。这个参数的目的就是给函数提供一个基地址,以便于函数体内能找到对象的成员变量。那非静态成员函数是如何根据this指针找到成员变量的呢?直接看例子吧 1没有虚表的情况 view plain #include <iostream> #include <stdio.h> using namespace std; class A { public : int x; int y; public : void F1() { this ->x = 1; this ->y = 2; cout<< "this指针得值是:" <<std::hex<<std::showbase<< this <<endl; } }; int main( int argc, char ** argv) { A a; cout<< "a对象的地址是:" <<&a<<endl; cout<< "a对象的大小是:" << sizeof (A)<<endl; cout<< "成员a.x的地址是: " <<&a.x<<endl; cout<< "成员a.x的偏移是

c++指向结构体变量指针

爱⌒轻易说出口 提交于 2020-02-29 16:34:12
转自http://www.jb51.net/article/42140.htm 定义: 结构体变量的指针就是该变来那个所占据的内存段的起始地址。可以设一个指针变量,来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。 设p是指向结构体变量的数组,则可以通过以下的方式,调用指向的那个结构体中的成员: (1)结构体变量.成员名。如,stu.num。 (2)(*p).成员名。如,(*p).num。 (3)p->成员名。如,p->num。 代码如下: #include<iostream> #include<string> using namespace std; struct Candidate{ string name; int count; }; int main(){ Candidate c_leader[2]={"Tom",5,"Marry",8}; Candidate *p1,*p2; p1=c_leader; cout<<(*p1).name<<":"<<(*p1).count<<endl; p2=&c_leader[1]; cout<<p2->name<<":"<<p2->count<<endl; return 0; }    说明,结构体数组也和其他数组一样,一维数组的数组代表首个元素的地址 我们了解到,结构体中可以包含很多类型的成员变量

反汇编学习

让人想犯罪 __ 提交于 2020-02-29 07:06:48
(转: http://www.kuqin.com/assemble/20071122/2492.html ) 汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机)   ============================   x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx.    在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处:   1. 通用寄存器:   EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途)      这些32位可以被用作多种用途,但每一个都有"专长". EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器. EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址. ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器. EDX是...(忘了..哈哈)但它总是被用来放整数除法产生的余数.

C语言指针的长度和类型

爱⌒轻易说出口 提交于 2020-02-29 06:27:00
本文地址: http://www.cnblogs.com/archimedes/p/point-length-type.html ,转载请注明源地址。 如果考虑应用程序的兼容性和可移植性,指针的长度就是一个问题,在大部分现代平台上,数据指针的长度通常是一样的,与指针类型无关,尽管C标准没有规定所有类型指针的长度相同,但是通常实际情况就是这样。但是函数指针长度可能与数据指针的长度不同。 指针的长度取决于使用的机器和编译器,例如:在现代windows上,指针是32位或是64位长 测试代码: #include<stdio.h> #include<math.h> #include<stdlib.h> #include<stddef.h> struct p{ int n; float f; }; int main() { struct p *sptr; printf("sizeof *char: %d\n", sizeof(char*)); printf("sizeof *int: %d\n", sizeof(int*)); printf("sizeof *float: %d\n", sizeof(float*)); printf("sizeof *double: %d\n", sizeof(double*)); printf("sizeof *struct: %d\n", sizeof

指针与引用的区别

此生再无相见时 提交于 2020-02-28 22:16:39
标题 :指针与引用的区别 首先,函数参数有三种。一是传值,二是传地址,三是传引用。 传值,简单的来说,就是复制这个值,然后将复制体传到子函数中,对于其任何改变,其本身并不会变化。 传地址,就是将该变量的门牌号传给子函数,在子函数中对于其改变,本身也变化。 传引用,粗暴地说就是取小名。两个变量名指的是同一变量。改变时相互的。 是指针是C语言的精华,引用是C++对C语言的扩充。 首先来看指针。 # include <stdio.h> void swap ( int * a , int * b ) ; int main ( ) { int a = 3 , b = 4 ; swap ( & a , & b ) ; printf ( " a = %d ,b = %d" , a , b ) ; return 0 ; } void swap ( int * a , int * b ) { int temp ; temp = * a ; * a = * b ; * b = temp ; } 再来看引用 # include <iostream> using namespace std ; void swap ( int & a , int & b ) ; int main ( ) { int m = 3 , n = 4 ; swap ( m , n ) ; cout << "m=" << m <<

剑指Offer刷题总结

你。 提交于 2020-02-28 21:50:31
1. 二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路题 从右上角或者左下角开始缩小范围。 2. 替换空格 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 语法题 3. 从尾到头打印链表 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 头插法 数组反转 栈 递归 4. 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 递归 API:Arrays.copyOfRange() 5. 用两个栈实现队列 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 简单题 6. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5

C++的强制类型转换

拜拜、爱过 提交于 2020-02-28 19:18:08
c/c++强制类型转换 Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 reinterpret_cast?区别是什么?为什么要注意? A:转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符。比如,为了转换一个类型为doubole的浮点数的指针到整型: 代码: int i; double d; i = (int) d;或者:i = int (d); 对于具有标准定义转换的简单类型而言工作的很好。然而,这样的转换符也能不分皂白的应用于类(class)和类的指针。ANSI-C++标准定义了四个新的转换符:'reinterpret_cast', 'static_cast', 'dynamic_cast' 和 'const_cast',目的在于控制类(class)之间的类型转换。 代码: reinterpret_cast<new_type>(expression) dynamic_cast<new_type>(expression) static_cast<new_type>(expression) const_cast<new_type>(expression) 1 reinterpret_cast reinterpret_cast 转换一个指针为其它类型的指针

C++_十六章_智能指针_关于string对象、string指针和空指针的总结_关于智能指针相互赋值会导致出现空字符的问题_标准模板库

允我心安 提交于 2020-02-28 10:55:18
目录 1、智能指针 2、关于string对象、string指针和空指针的总结 3、关于智能指针相互赋值会导致出现空字符的问题 4、标准模板库 1、智能指针 01) 在使用new为指针分配内存空间的时候,有可能会出现忘记添加delete或者是没有忘记但不执行delelte的情况 ,此时就会导致内存泄露,例如如下情况: 1 void remodel(std::string & str) 2 { 3 std::string * ps = new std::string(str); 4 double * pd1 = new double[8]; //new返回一个可以存储8个double行数据的地址,pd1是一个指针 5 ... 6 if(weird_thing()) 7 throw exception(); //如果执行此句,那么就有可能不执行下面的delete 8 str = *ps; 9 delete ps; 10 return; 11 } delete有可能不会被执行的情况 02)使用智能指针 (1)这三个智能指针模板(auto_ptr、unique_ptr和shared_ptr)都定义了类似指针的对象,可以将new获得的地址赋给这些对象。当智能指针过期时,其析构函数将使用delete  来释放内存。下图说明了常规指针和auto_ptr之间的差别.(unique

b+树的原理

橙三吉。 提交于 2020-02-28 10:27:38
Java 内存区域 <ignore_js_op> Heap 线程公有 存放实例对象 是GC主要管理区域,因此可以更细致的划分为:新生代、老年代 再细致一点划分:Eden区、From Survivor区、To Survivor区 内存空间:可以物理上不连续、逻辑上连续即可。 Method Area 线程公有 主要存储:类信息、常量、静态变量、编译后的代码 运行时常量池 主要存储:编译期的字面量以及符号引用 具有动态性,即可以在运行时将常量放入池中。 VM Stack 线程私有 主要包括: 局部变量表:存放编译期的各种基本数据类型、对象引用、returnAddress类型 操作数栈:每一个元素可以为任意的java类型,32位数据类型所占容量为1,64位数据类型所占容量为2 动态连接:class文件的常量池中有大量的符号引用,这些符号引用有一部分是在类加载阶段或者在第一次使用的时候就转换为直接引用,这部分成为静态解析。另一部分是每一次运行的时候转化为直接引用,这部分即为动态连接。 方法出口:例如A方法中调用了B方法,B方法的返回值压入A方法的栈帧中。 Native Method Stack 线程私有 与VM Stack相似,唯一区别在于该栈为Native方法服务。 Hot Spot 将VM Stack 与 Native Method Stack 合而为一。 Program Counter