指针

AVR汇编初探之一《AVR单片机的CPU内部结构》

别说谁变了你拦得住时间么 提交于 2019-12-24 10:57:39
学单片机那么久了,感觉想要深入,还得看汇编语言,至少得了解单片机内部结构。 下面就以ATmega16为例,介绍一下AVR单片机结构和汇编语言。 AVR单片机的CPU内核结构 如上两图,左图是虚线框内AVR CPU的内核结构,右图是AVR单片机内核结构的方框图,可以看出AVR单片机的数据总线(CPU字长)是8位的,也就说它是8位单片机。 AVR采用了Harvard结构,具有独立的数据和程序总线,CPU在执行一条指令的同时,就将PC中指定的下一条指令取出,构成了一级流水线运行方式,实现了一个时钟周期执行一条指令,数据吞吐量高达1MIPS/MHz。 AVR CPU内核由几个重要的部分组成,它们分别是: A.算数逻辑单元ALU(Arithmetic Logic Unit) AVR ALU与32个通用工作寄存器直接相连。寄存器与寄存器之间、寄存器与立即数之间的ALU运算只需要一个时钟周期。ALU操作分为3类:算术、逻辑和位操作,此外还提供了支持无/有符号数和分数乘法的乘法器,操作结果的状态将影响到状态寄存器SREG(Status Register)。 B.程序计数器PC、指令寄存器和指令译码器 程序计数器PC用来存放下一条需要执行指令在程序存储器(ROM)空间的地址(指向FlashROM空间),取出的指令存放在指令寄存器中,然后送入指令译码器中产生各种控制信号,控制CPU的运行(执行指令)。

PHP运行原理

坚强是说给别人听的谎言 提交于 2019-12-24 09:28:53
PHP简介:PHP是一种适用于web开发的动态脚本语言(网页快捷开发),是用纯C语言实现的。我们可以认为PHP就是一个用C语言实现包含大量组件的软件框架。更狭义一点可以认为是一个功能强大的UI框架。 PHP的设计理念及特点 多进程模型:PHP采用多进程模型,不同请求之间互不干涉,保证了一个请求挂掉不会对其它请求和服务造成影响。当然,PHP目前已支持多线程模型; 弱类型语言:PHP是一门弱类型语言,变量的类型在定义时是不需要给定的,会在运行中根据变量的值发生隐式或是显式的类型转换,这种机制的灵活性在web开发中非常方便、高效; PHP通过引擎(zend)+组件(extension)的模式来降低内部耦合; 中间层(sapi)隔绝web server 与 PHP; 语法简单灵活,没有太多的规范,当容易导致代码风格的混乱。 PHP的四层架构(如下图) Zend引擎:也可以称之为Zend软件虚拟机,用于翻译执行PHP代码。Zend整体用纯C实现,是PHP的内核部分,它将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行opcode代码,并实现相应的处理方法、实现了基本的数据结构(主要的数据结构是hashtable)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。 Opcode:是一种PHP脚本编译后的中间语言

return *this 与return this分别是什么,有什么区别

六眼飞鱼酱① 提交于 2019-12-24 07:08:15
学习了该博客http://blog.csdn.net/stpeace/article/details/22220777 加上自己的理解 this是个指针,存在于类的非静态成员函数内部,return this 返回的是指向该对象的指针,或 返回的是当前该对象的地址。 return *this 返回当前对象的引用,或者说返回该对象本身 还是当前对象的克隆 代码整理了一下,根据输出地址是否相同来判断是对象本身还是对象的克隆: #include <iostream> using namespace std; class A { public: A(int a = 1, int b = 1):x(a),y(b) { } A &get() { return *this; } private: int x; int y; }; int main() { A a(1,2); cout << &a << endl; cout << &a.get() <<endl; } 输出地址为: 地址一模一样,说明这两者是a 和 get函数返回的 *this 是同一个东西。 如果将 A &get() { return *this; } 改为 A get() { return *this; } 则 输出地址为 ,两者地址不一样,即a 和 return *this 地址不一样,但是所含数据一样,说明返回 是a

C++学习笔记----3.2 C++引用在本质上是什么,它和指针到底有什么区别

妖精的绣舞 提交于 2019-12-24 06:56:57
从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。 在 C++ 中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。 而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。 引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数

C语言高级代码

拟墨画扇 提交于 2019-12-24 06:45:04
指针 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量。 # include <stdio.h> int main ( ) { int a = 2 , b = 6 , c = 10 , d = 8 , e = 4 ; //取地址运算符 int * pa = & a ; int * pb = & b ; int * pc = & c ; int * pd = & d ; int * pe = & e ; printf ( "%#X %#X %#X %#X %#X\n" , pa , pb , pc , pd , pe ) ; //取值运算符 printf ( "%d %d %d %d %d\n" , * pa , * pb , * pc , * pd , * pe ) ; return 0 ; } 指针访问数组 # include <stdio.h> //下标法 /* int main() { int a[12]={2,3,6,5,8,0,9,4,1,7,11,20}; for(int i=0;i<12;i++) {

数组,指针与函数

与世无争的帅哥 提交于 2019-12-24 04:22:59
一.数组作为函数参数 1. 数组元素 可以用作函数实参,用法与变量相同,向形参传递数组元素的值。(单向传递) 2.数组名可以用作函数的实参和形参,传递的是数组第一个元素的地址。(可利用这一特点改变实参数组的值) 3.形参数组可不指定其大小,因为形参数组首元素和实参数组首元素具有同一地址,定义时在数组名后跟一个空的方括号。 4.多维数组名作函数参数时,对形参的定义可以省略第一维的大小。(int array [ ][8]) 二.通过指针引用数组 1.指针变量既可以指向变量,也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元素的地址。 2.引用数组元素可用下表法和指针法。(使用指针法使目标程序质量高,占用内存少,运行速度快) 例:int a[10]; int p; p=&a[0]或p=a; 或者直接写成int p=a; 3.当指针指向一个数组元素时,p+1指向同一数组中下一个元素,p-1指向同一数组中的上一个元素,即 加或减一个数组元素所占用的字节数。 (int,long,float—d=4;char—d=1) 例:p的初值为&a[0],则 * ( p+1)= (a+i)=a[5]([ ]实际上是变址运算符,a[ i]即计算a+i) 4.如果指针变量p1和p2都指向同一数组中的元素,如执行p2-p1,结果是 两个地址之差除以数组元素长度*

C++四种类型之间的转换

浪子不回头ぞ 提交于 2019-12-24 04:07:16
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a。 C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。 const_cast,字面上理解就是去const属性。 static_cast,命名上理解是静态类型转换。如int转换成char。 dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多态类型转换。 reinterpret_cast,仅仅重新解释类型,但没有进行二进制的转换。 4种类型转换的格式,如:TYPE B = static_cast(TYPE)(a)。 const_cast 去掉类型的const或volatile属性。 struct SA { int i; }; const SA ra; //ra.i = 10; //直接修改const类型,编译错误 SA &rb = const_cast<SA&>(ra); rb.i =10; static_cast 类似于C风格的强制转换。无条件转换,静态类型转换。用于: 1. 基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast) 2. 基本数据类型转换。enum, struct, int, char, float等。static

c++父类指针指向子类对象.

感情迁移 提交于 2019-12-24 04:04:33
父类子类指针函数调用注意事项 1,如果以一个基础类指针指向一个衍生类对象(派生类对象),那么经由该指针只能访问基础类定义的函数(静态联翩) 2,如果以一个衍生类指针指向一个基础类对象,必须先做强制转型动作(explicit cast),这种做法很危险,也不符合生活习惯,在程序设计上也会给程序员带来困扰。(一般不会这么去定义) 3,如果基础类和衍生类定义了相同名称的成员函数,那么通过对象指针调用成员函数时,到底调用那个函数要根据 指针的原型来 确定,而不是根据指针实际指向的对象类型确定。 4.如果是衍生类取址(&b)给 父类指针,调用子类 。 虚拟函数就是为了对“如果你以一个基础类指针指向一个衍生类对象,那么通过该指针,你只能访问基础类定义的成员函数”这条规则反其道而行之的设计。 来源: CSDN 作者: mengxuepingwxhn 链接: https://blog.csdn.net/qq_38998213/article/details/103587765

delphi指针

元气小坏坏 提交于 2019-12-23 22:24:25
delphi中由于vcl的存在,于是指针很少用到。昨天和“贱男”(一个做sp的朋友)在讨论一个多线程的问题,最后考虑是不是指针传递的错误。 要求是这样的:sql的数据库,程序中的主线程以sql查询获取二十条记录,然后传递给子线程,主线程挂起。while ....not语句,一条条赋给子线程,每子线程存一条记录,以指针传递的(pchar).应用华为的api(vc编写)其中LPCSTR用delphi 中pchar代替,但是最后子线程得到的数据是乱七八遭的东西。不从数据库读取数据,读字符串和变量都是正确的,实在不解?是不是指针传递数据时候出错? 顺便放出pascal的指针: 浅谈Object Pascal的指针 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是C语言的灵魂,一点都不为过。同时,这种说法也让很多人 产生误解,似乎只有C语言的指针才能算指针。Basic不支持指针,在此不论。其实,Pascal语言本身也是支持指针的。从最初的Pascal发展至今 的Object Pascal,可以说在指针运用上,丝毫不会逊色于C语言的指针。 以下内容分为八个部分,分别是 一、类型指针的定义 二、无类型指针的定义 三、指针的解除引用 四、取地址(指针赋值) 五、指针运算 六、动态内存分配 七、字符数组的运算 八、函数指针 一、类型指针的定义

嵌入式软件工程师经典面试题

[亡魂溺海] 提交于 2019-12-23 21:01:56
1、int a[10]={1,2,3,4,5,6,7,8,9,0}; int *p=&a[1]; 则p[6]等于8 2、整数数组清零:bzero(),memset()。 3、sizeof();测试变量所占地址的字节数 4、 main() { char *str[]={“ab”,“cd”,“ef”,“gh”,“ij”,“kl”}; char t; t=(str+4)[-1]; printf("%s",t); }则显示"gh" 5、小端:低位字节数据存储在低地址 大端:高位字节数据存储在低地址 例如:int a=0x12345678;(a首地址为0x2000) 0x2000 0x2001 0x2002 0x2003 0x12 0x34 0x56 0x78 大端格式 6、异步IO和同步IO区别 如果是同步IO,当一个IO操作执行时,应用程序必须等待,直到此IO执行完,相反,异步IO操作在后台运行, IO操作和应用程序可以同时运行,提高系统性能,提高IO流量; 在同步文件IO中,线程启动一个IO操作然后就立即进入等待状态,直到IO操作完成后才醒来继续执行,而异步文件IO中, 线程发送一个IO请求到内核,然后继续处理其他事情,内核完成IO请求后,将会通知线程IO操作完成了。 7、用变量a定义 一个整型数 int a; 一个指向整型数的指针 int a; 一个指向指针的指针