指针

C++中动态联编与静态联编

有些话、适合烂在心里 提交于 2020-01-10 00:20:31
1.函数联编 将代码中的函数调用解释为执行特定的函数代码块,叫做函数联编。 函数联编分为静态联编和动态联编: 静态联编:在编译过程中进行联编,又称早期联编; 动态联编:在程序运行时进行联编,又称晚期联编; 在C++中,动态联编与通过指针和引用调用方法有关,其实可以说,这是由继承控制的。通常,C++不允许将一种类型的地址赋给另一种类型的指针,也不允许一种类型的引用指向另一种类型。 但是,这也有例外,指向基类的引用或指针可以引用派生类对象,而不必进行显式类型转换(将派生类指针或引用转换为基类引用或指针被称为向上强制类型转换);反过来,将基类指针或引用转换为派生类指针或引用被称为向下强制类型转换。注意,如果不使用显式类型转换,则向下强制类型转换是不允许的。 2.结合代码理解 class Animal { //动物基类 private : //...... public : virtual void eat ( ) const { cout << "动物吃方法!!" << endl ; } //...... } ; class Dog : public Animal { //狗类派生于动物类 private : //...... public : void eat ( ) const { cout << "狗吃骨头!!!" << endl ; } //...... } ;

Linux C语言:指针与内存

二次信任 提交于 2020-01-10 00:08:49
1 . 计算机中的数据表示方法 单位:字节(byte) 1byte = 8 bit 计算用二进制 显示为十进制 编程为十六进制 2 . 内存管理 Q : 32位系统 最大使用4G内存? A : 32位系统,地址总线是32位,也就是寻址空间是32位; 32位指的是:给内存编号只能编到32个二进制位; 32根地址总线就是2 32 个状态; 2 32 = 2 10 *2 10 *2 10 *4=1k * 1k * 1k *4=1M * 1k *4=4G 64位系统可以管理2 64 (4G*4G)的内存 地址从0x0000 0000 0000 0000 到 0xFFFF FFFF FFFF FFFF 任意一个地址可以储存1个字节也就是8位2进制 其中,代码放在 代码段; 全局变量、常量、静态变量放在 数据段; 局部变量放在 栈; 3 . 变量和指针的本质 变量的本质是什么? 变量名它只是一个代号,代表一个内存地址空间 变量的本质就是内存 C语言无法对某个内存进行直接操作 指针也是变量,保存的就是内存地址 指针的本质就是地址 4 . 操作系统对内存的管理 32bit操作系统 : 指针4个字节 64bit操作系统 : 指针8个字节 只要是地址,不管指向什么类型,所占字节数都是相同的,指向函数地址也是一样。 5 . 函数栈以及数据段内存 最先分配的栈地址最大,从栈顶向下分配; 栈的特点:先进后出

mpi4py 中的访问文件数据方法

邮差的信 提交于 2020-01-09 23:28:15
在 上一篇 中我们介绍了 mpi4py 中的并行文件视图操作方法,下面我们将介绍访问文件数据的相关方法。 文件访问方法 MPI 环境下应用程序对文件的访问主要有 3 种特征:定位(positioning),包括显式偏移和隐式文件指针;同步性(synchronism),主要包括阻塞、非阻塞和分步集合操作;集合性(coordination),主要包括非集合操作和集合操作。下表列出的相应的访问方法(MPI.File 类方法)反应了这些操作特征的组合,其中结合了两种类型的文件指针——独立文件指针和共享文件指针。 文件访问方法 上表中访问文件数据的方法很多,不能在此一一详细介绍,但是它们根据访问文件的特征却有其规律性,下面我们介绍 3 种访问特征的具体含义和数据访问的基本规范: 定位(positioning) MPI 中的文件定位有 3 种:显式偏移(explicit offset)、独立文件指针(individual file pointers)和共享文件指针(shared file pointers),相同进程中可混合使用这 3 种操作方式,彼此无影响。 所有使用显式指针的方法,其命名中都包含 “_at“ 字符,使用显式指针访问数据时,其参数为直接指定的文件偏移位置,而不必再通过任何文件指针,也与文件视图中的相对偏移位置无关。 注意 :这里使用偏移不需要执行 seek 操作。

为什么可以用while(cin)?

放肆的年华 提交于 2020-01-09 23:06:46
转自:http://www.cnblogs.com/propheteia/archive/2012/07/24/2607091.html /** * @brief The quick-and-easy status check. * * This allows you to write constructs such as * "if (!a_stream) ..." and "while (a_stream) ..." */ operator void*() const { return this->fail() ? 0 : const_cast<basic_ios*>(this); } 如果你把一个basic_ios类的对象(cin就是)放到if语句的括号里,它就会被转换成void*型。如果输入失败的话,就会得到一个空指针(也就是0),那么if语句就不能通过。 #include<iostream> #include<utility> using namespace std; int main() { int i; do { cout<<i<<endl; }while(cin>>i); } 首先输出个0.之后输入X,输出X;当输入ctrl+d时,没有输出,结束。 #include<iostream> #include<utility> using namespace std;

指针数组与指向指针的指针

巧了我就是萌 提交于 2020-01-09 21:56:44
指针数组与指向指针的指针 http://wlkc.gdqy.edu.cn/jpkc/portal/blob?key=173314 指针数组和数组指针的区别 http://allew.blog.163.com/blog/static/3374389720094148449239/ 指针数组[组图] http://school.cnd8.com/c/jiaocheng/9212.htm 函数指针和指针函数 http://lionwq.spaces.eepw.com.cn/articles/article/item/18258 ======================================== source 1 #include <stdio.h> int main(void) { char *ptr[4] = {"beijing", "shanghai", "tianjin", "chongqing"}; int i, *iptr[3], a[3]={1,2,3},b[3][2]={1,2,3,4,5,6}; for(i=0; i<4; i++) printf("%s/t", ptr[i]); printf("/n"); for(i=0; i<3; i++) iptr[i]=&a[i]; for(i=0; i<3; i++) printf("%d/t", *iptr[i]

【C语言笔记】#define与typedef的区别

≡放荡痞女 提交于 2020-01-09 18:53:05
1、#define define是预处理指令,在编译时不进行任何检查,只进行简单的替换 宏定义的一般形式为: #define 宏名 字符串 这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符串等同,它不需要双引号。 2、typedef typedef是在C语言中用来为复杂的声明定义简单的别名,它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。 typedef取别名的一般形式为: typedef 旧名字 新名字 3、define与typedef的区别 (1)#define之后不带分号,typedef之后带分号。 (2)#define可以使用其他类型说明符对宏类型名进行扩展,而 typedef 不能这样做。如: #define INT1 int unsigned INT1 n; //没问题 typedef int INT2; unsigned INT2 n; //有问题 INT1可以使用类型说明符unsigned进行扩展,而INT2不能使用unsigned进行扩展。 (3)在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证。如: #define PINT1 int*; P_INT1 p1,p2; //即int *p1,p2;

C++中typedef和define的区别

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-09 16:48:17
typedef和#define的用法与区别 一、typedef的用法 在C/C++ 语言 中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以 增强 程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。 二、#define的用法 #define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编 译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以 发现 潜在的错误及其它代码维护问题,它的实例像: #define INT int #define TRUE 1 #define Add(a,b) ((a)+(b)); #define Loop_10 for (int i=0; i<10; i++) 在Scott Meyer的Effective C++一书的条款1中有关于#define语句弊端的分析,以及好的替代方法,大家可参看。 三、typedef与#define的区别 从以上的概念便也能基本清楚,typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而

【C++】智能指针详解

我的梦境 提交于 2020-01-09 16:08:58
智能指针 :将对内存的管理交付给对象,当对象析构时就能够清理资源,有效的避免内存泄露问题。(因为原生态指针(T*)管理资源时,若用户忘记释放内存,则可能会导致资源泄露。) 下面介绍四种智能指针 头文件均为#include< memory> 一.auto_ptr智能指针 C++98中经历过两次版本更新。 C++11中保留第一版auto_ptr。 1.首先介绍智能指针的三大结构 1.RAII:利用对象生命周期来控制内存资源,构造时获取资源,析构时释放资源。 特点:不需要显式释放资源。对象所需资源在其生命周期内始终有效。 2.重载运算符 * (解引用) -> 3.拷贝构造方法/重载=运算符方法,所产生的浅拷贝问题。 2.auto_ptr第一版本模拟实现 解决浅拷贝:通过 资源转移 的方法,一份资源只能由一个指针管理。之前的指针设置为空。 #include<iostream> using namespace std; template <class T> class auto_ptr1 { public: //1.RAII: auto_ptr1(T* ptr=nullptr) :_ptr(ptr) {} //2.重载* -> 运算符 T& operator *() { return *_ptr; } T& operator ->() { return _ptr; } //3.拷贝构造

线性表的链式表示和实现

 ̄綄美尐妖づ 提交于 2020-01-09 04:12:02
一、前言 线性表的顺序存储结构特点是:逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中的任何一个元素。 缺点:在作插入删除操作时,需要移动大量元素。 二、链式存储结构 概念:它不要求逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序存储结构所具有的弱点,但同时也失去顺序表可随机存取的优点。 三、线性链表 存储空间可以连续也可以不连续。为了表示ai和ai+1的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。它的节点包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。指针域中存储的信息称为指针或链。n个节点链接成一个链表,即为线性表: (a1,a2,…..,an) 又因为链表的每个节点中只包含一个指针域,故又称为线性链表或单链表。 用线性链表表示线性表时,数据元素之间的逻辑关系是由结点中的指针指示的。换句话说,指针为数据元素之间的逻辑关系的映像,则逻辑上相邻的两个数据元素其存储的物理位置不要求紧邻,因此这种存储结构为非顺序映像或者链式映像。 四、定义 typedef struct LNode { ElemType data; struct LNode *next; } LNode *LinkList;    有时候我们在单链表的第一个结点之前附设一个结点,称之为头结点

二维数组查找

岁酱吖の 提交于 2020-01-09 02:07:23
1.int a; int*a; int **a; int (*a)[10]; int (*a) (int)的区别。 a) int a 表示一个内存空间,这个空间用来存放一个整数。 b) int *a指向一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间。 c) int **a表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放指针的空间,并且指向的这个空间中的指针,指向一个整数。指向了一个b)中提到的空间。 d) int(*a)[10]表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个长度为10,类型为int的数组;与int **a的差别主要体现在a++上。 e) int (*a) (int)表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个int型的参数,并且函数的放回类型也是int。 2.当声明一个数组时,数组的名字也是一个指针。32位系统上,对任意指针求sizeof,得到的结果都是4. 当数组作为函数参数进行传递时,数组自动退化为同类型的指针。 3.例题:二维数组中的查找。 二维数组的每一行是按从左到右递增以及从上到下递增来排序的,判断数组中是否含有一个整数。 解决思想:找到最右边的列的第一个数,如果比要寻找的数大,则该列都不用再考虑,如果比要寻找的数小,则该行都不用再考虑。递归求解。