指针

1159: 最大的两个数(指针专题)

↘锁芯ラ 提交于 2020-01-10 14:13:09
题目描述 求n个整数中的最大的两个元素。要求定义一个函数LargestTow(),求数组a的最大的两个元素,分别存入形参指针pfirst和psecond所指存储单元,函数原型如下: void LargestTow(int a[],int n,int *pfirst,int *psecond) { /*数组a有n个元素,将数组中的最大值存入形参指针pfirst所指内存单元,将数组中第二大的值存入形参指针psecond所指内存单元。 */ } 输入 输入有两行,输入第一行是一个整数n,1<n<=1000;第二行是n个整数,由空格隔开。 输出 输出两个整数,表示数组中最大的两个值。输出占一行。 样例输入 5 6 3 4 9 8 样例输出 9 8 # include <stdio.h> void LargestTow ( int a [ ] , int n , int * pfirst , int * psecond ) ; int main ( ) { int n ; int a [ 1000 ] ; scanf ( "%d" , & n ) ; int i ; for ( i = 0 ; i < n ; i ++ ) { scanf ( "%d" , & a [ i ] ) ; } int m1 , m2 ; int * pfirst , * psecond ; pfirst = &

NSFX手册的学习(1)

拥有回忆 提交于 2020-01-10 12:22:43
(边学手册边学C++) 组件的行为由组件所提供和使用的接口决定。组件通过一系列 的接口 来实现其函数功能的。目标模型的根接口是IObject。每一个接口一定直接或间接地从IObject衍生出来。每一个组件都一定会应用到IObject。 我们来看下面这个例子: class IObject { public: virtual ~IObject(void) BOOST_NOEXCEPT {} virtual refcount_t AddRef(void) = 0; virtual refcount_t Release(void) = 0; virtual void* QueryInterface(const Uid& iid) = 0; };IObject这个类定义了四个虚函数。---------------我们来看一下关于虚函数的知识:*虚函数是为了实现多态性的。*基类指针只能访问派生类的成员变量,但是不能访问派生类的成员函数。为了让基类指针能够访问派生类的成员函数,c++增加了虚函数。使用虚函数非常简单,只需要在函数声明前面增加virtual关键字。*有了虚函数,基类指针指向基类对象时就使用基类的成员(包括成员函数和成员变量),指向派生类对象时就使用派生类的成员。*换句话说,基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式

C++ Primer:第2章总结

随声附和 提交于 2020-01-10 11:39:17
第2章 变量和基本类型 2.1 基本内置类型 基本内容: 算术类型包含字符,整型数,布尔值和浮点数,空类型不对应具体值,仅用于无返回值时函数的返回类型等特殊场合。 类型转换:将对象从一种给定的类型转换为另一种类型。 字面值常量:整型字面值,浮点型字面值,字符字面值,字符串字面值,转义序列,字面值前缀和后缀,布尔字面值,指针字面值。 备注: 整型包括布尔类型和字符类型。 bit是数据存储的最小单位,byte是数据处理的基本单位,字是整数运算的自然单位:1 word = 4 byte(32位机器), 1byte = 8 bit。 类型选择:若数值不为负选用无符号类型;整型运算选用int;算术表达式不用char或bool;浮点数运算选用double。 切勿混用带符号类型和无符号类型。 2.2 变量 基本内容: 变量定义:类型说明符+变量名列表。初始化,列表初始化,默认初始化。 变量声明与变量定义:声明和定义都规定变量的类型和名字,此外定义申请存储空间,可能初始化;变量只能定义一次,声明多次。 标识符:由字母、数字和下划线组成,必须以字母或下划线开头,区分大小写。 名字作用域:全局作用域,块作用域,内层作用域,外层作用域 备注: 初始化 != 赋值。 用{}进行列表初始化,函数体内部的内置类型变量不会被默认初始化。 变量名用小写,类名以大写开头,多个单词用下划线连接。 变量第一次使用时

写入和读取float型数据

我怕爱的太早我们不能终老 提交于 2020-01-10 10:16:32
一、目的 写入和读取float数据 二、环境 开发工具:DEV-C++ 三、方法 傻瓜式方法 假如存储1.234,那么先把1.234*1000=1234,将1234存到存储器中。读取出来的时候,再将1234/1000=1.234,这个方法很简答易懂,但是精度不高。 byte数组与指针 关键:一是数据以二进制的形式存储;二是简单应用数组和指针。 接下来直接上代码: unsigned char a[4]; unsigned char i; unsigned char *P,*PX; float b1 = 1.123,b2; void *Fl; //不确定类型指针 printf("b1=%f\n\n", b1); //float转到byte数组 P = (unsigned char*)&b1; //指针指向b1的首地址 for(i=0; i<4; i++) { a[i] = *(P+i); //将四个字节的float数,一个一个字节地存入数组中 printf("a[%d]=%x\n", i,a[i]); } //byte数组转到float Fl = &b2; //指针指向b2的首地址 PX = a; //指针指向数组a[4]的首地址 for(i=0; i<4; i++) { *((unsigned char*)Fl+i) = *(PX + i); //以指针为桥梁,进行赋值 printf

深入理解计算机系统(3.3)---数据传送(或者说复制)指令详解

折月煮酒 提交于 2020-01-10 08:57:02
引言   上一章我们已经介绍了汇编语言的基础部分,包括数据格式、寄存器以及操作数的标识方式,接下来我们就应该去认识一下汇编语言当中的各个指令了。这些指令大多数都非常简单,但是组合在一起却能模拟出我们程序当中想要的任何效果,确实是十分神奇的一件事。    数据传送指令   数据传送指令的目的是为了将一个数据从一个位置复制到另外一个位置。既然如此,那么数据传送指令就会包含一个源操作数和一个目的操作数,指令会将原操作数的值复制到目的操作数并覆盖。   数据传送指令一共可分为五种,分别是mov、movs、movz、push以及pop,下面LZ依次介绍一下这五个指令的作用。    mov指令   mov指令的作用是将源操作数S中的数据复制到目的操作数D中,mov指令有一个数据格式和两个操作数,因此一般的形式为[movx S D]。其中x为数据格式,S为源操作数,D为目的操作数。   这里举一个简单的例子,比如我们有一条指令为movl %edx %eax。那么它的执行过程就如下图所示。   可以看到,在指令执行之后,%edx寄存器当中的内容会被复制到%eax寄存器。需要一提的是,mov指令可以在后面加上任何数据格式,比如上面这一过程中,数据格式则为四个字节,也就是双字。因此不难推断出,我们还可以使用movb和movw去复制一个字节或者两个字节。 movs指令  

C++中的显示类型转换

拥有回忆 提交于 2020-01-10 08:49:01
C++中显示转换也成为强制类型转换(cast),有四种:static_cast、dynamic_cast、const_cast、reinterpret_cast。命名的强制类型转换符号一般形式如下: cast_name<type>(expression); 以下分别介绍 一、static_cast 任何具有明确定义的类型转换,只要不包含底层const都可以使用static_cast。好吧这句话我不是很懂,换句话:编译器隐式执行的任何类型转换都可以由static_cast显示完成。也就是说,两类型之间可以发生隐式的转换,就可以用static_cast显示转换,有点意思。但要知道的是C++基本类型的指针之间不含有隐式转换(void*除外、const的有些也是可以的),需要 显示转换 。什么意思?如下: double d=3.14; int i=d; //编译器的隐式转换,等价于下面这条语句 int i=static_cast<int>(d); /*指针之间的转换*/ char str[]="good"; char *ptr=str; int *p=static_cast<int *>(ptr); //编译错误,两者之间的转换要显式,如下 int *p=(int *)(ptr); 仅当类型之间可隐式转换时(除类层次见的下行转换以外),static_cast的转换才是合法的,否则将出错。

2019春第六周作业

落花浮王杯 提交于 2020-01-10 08:33:16
第六周作业 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass4-2018/homework/2890 我在这个课程的目标是 了解指针的用法 这个作业在那个具体方面帮助我实现目标 利用指针做题 参考文献 C语言程序设计II 一、本周完成的作业 基础作业 函数题 6-1 求两数平方根之和 (10 分) 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。 函数接口定义: double fun (double *a, double *b); 其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。 裁判测试程序样例: #include<stdio.h> #include <math.h> double fun (double *a, double *b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b); printf ("y=%.2f\n", y ); return 0; } /* 请在这里填写答案 */ 输入样例: 12 20 输出样例: y=7.94 1)

x86常用汇编寄存器

时光怂恿深爱的人放手 提交于 2020-01-10 04:51:47
通用寄存器 32位 16位 高8位 低8位 EAX AX AH AL EBX BX BH BL ECX CX CH CL EDX DX DH DL ESI SI EDI DI ESP SP EBP BP E:Extend,X:逻辑与算数 EAX (Extend Add):累加器,在乘法和除法指令中自动使用;Win32中,一般用在函数的返回值中。 EBX (Extend Base):基地址寄存器,DS(数据段)中的数据指针。 ECX (Extend Count):计数器,CPU自动使用ECX作为循环计数器,在自妇产和循环操作中常用,在循环指令(LOOP)或串操-作中,ECX用来进行循环计数,每执行一次循环,ECX都会被CPU自动减一。 EDX (Extend Data):数据寄存器。 以上的寄存器常用来保存各种需要计算的值。 EBP (Extend Base Pointer):基地址指针寄存器,SS(堆栈段)中数据指针。EZBP有高级语言用来引用参数和局部变量,通常称为堆栈基地址寄存器。 ESP (Extend Stack Pointer):堆栈指针寄存器,SS(堆栈段)中堆栈指针,ESP用来寻址堆栈上的数据,ESP寄存器一般不参与算数运算,通常称为堆栈指针寄存器。 ESI (Extend Source Improve):源变址寄存器,字符串操作源指针。 EDI (Extend

指针和内存的关系

点点圈 提交于 2020-01-10 03:07:34
1、如何描述内存: (1)一段内存需要有一个地址和内存的大小才可以描述; (2)一个内存可以说是一个buffer,那么这个buffer就是一个指针,然后还需要一个buffer_size; (3)也可以用头指针和尾指针来描述,其实尾指针减去头也就是size; 2、具体代码 (1)要注意一个函数如何实现传内存的指针进去,如何修改这个指针的所指向的内容; (2)使用memcpy函数,将内存块复制过去; (3)如果传指针的指针进去,在函数体的外面是不能实现将这个指针指向需要的内存。 #include <stdio.h> #include <string.h> #include <stdlib.h> void* a_buf = NULL; void func1(const char* const Inbuf,const int InbufSize,char *const Outbuf,int *OutbufSize)//这个是正确的 { if((Inbuf != NULL) && (Outbuf != NULL) && (InbufSize != 0)) { memcpy(Outbuf,Inbuf,InbufSize); memcpy(Outbuf+InbufSize,"end\0",4); printf("func1 Outbuf = %s\n",Outbuf); printf(

线性表之链式存储结构

冷暖自知 提交于 2020-01-10 02:58:05
线性表的顺序存储结构要求逻辑关系上相邻的元素在物理位置上也相邻,这样方便了随机存取,但是在插入和删除元素时,需要移动大量元素,而线性表的链式存储则不要求逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序存储结构的可随机存取的优点,不过在插入和删除元素时比较方便。 单链表 单链表可由头指针唯一确定,在C语言中可用“结构指针”来描述 : 1: typedef struct Node { 2: ElemType data; 3: struct Node *next; 4: }Node, *LinkList; 有时,我们会在单链表的第一个结点之前附设一个结点,称之为头结点。头结点的数据域可以不存储任何信息,也可以存储如链表的长度等一些附加信息。头结点的指针域指向第一个结点,如果线性表为空,则头结点的指针域为NULL。 循环链表 表中最后一个结点的指针域指向第一个结点,整个链表形成一个环。 循环链表的操作与单链表基本一致,差别在于算法中的循环条件不是p或者p->next是否为空, 而是他们是否等于头指针。 有时候,在循环链表中设立尾指针而不设头指针,可以使某些操作简化。 双向链表 在双向链表的结点中有两个指针域, 其一指向直接后继,另一指向直接前驱,在C语言中可描述如下: 1: typedef struct Node { 2: ElemType data; 3: struct Node