学习 笔记

c语言指针学习笔记

间接访问和直接访问

(1)直接访问:执行写操作时,给变量赋值,是将值放到变量对应的存储空间,执行读操作时,直接从变量对应的储存空间读取已存放的数据。如:
a=4;(写)
printf("%d",a);(读)
间接访问:执行写操作时,如通过指针变量给它所指向的空间赋值,首先将指针变量的值读出来,为某内存单元的起始地址,然后,根据这个内存地址找到对应的存储单元,将值赋到其对应的存储空间内;执行读操作时,直接从变量对应的储存空间读取已存放的数据。如:p=&a;
p=456;
printf(
"%d",*p);

指针变量

变量中通常储存的不是通常的值,而是地址,则为指针变量
在c语言中,定义指针变量代码为:
被访问目标的数据的数据名 *指针变量名;

数组与指针的天然关系

(1)指针变量也能想数组一样通过“指针变量名[i]"的方式访问数组的地i个元素,前期为该指针指向了数组的起始地址。
(2)数组名【i】= *(数组名+i),其中数组名为基地址,i为偏移量;

指针的移动

相对移动通过基地址加偏移量的方式来技术
直接移动通过给指针变量赋值来移动
相对移动的规律:
1.在32位移动程序中,指向任何数据的指针变量所占用的存储大小空间固定为4字节即32bit.
2.相对移动的字节数等于它所指向目标数据的数据类型所占字节数。
3*以%02x输出p【i】值时,需写成p[i]&0xFF形式,原因是因为将char型转换成int型,因int为四字节而char为一字节,因此转换后的int型的高三字节将根据char型的二进制最高位进行扩展填充;
4指针为负向标时为倒序;
5特别需要注意,应当避免数组访问越界;

地址符在函数调用中的特殊作用

(1)void swap(int a,intb){t=a;a=b;b=t}该函数无法交换a,b的值
而使用指针时可以交换,如void swap(int *pa,int *pb){int t;t=*pa;*pa=pb;}

动态内存分配

动态内存分配函数
首次申请分配内存malloc(),calloc(),calloc分配后的空间会被初始化为零;重新申请分配内存realloc()
free()为释放内存;
动态分配内存能按照所需分配内存,分配内存后要及时释放;

汇编语言

汇编语言有以下三类指令
(1)汇编指令:机器码的对应符,有对应的机器码;
(2)伪指令:没有对应的机器码,由编译器执行,计算机不执行
(3)其他符合:如+,-*,/等,没有对应的机器码,由编译器执行
其核心为汇编指令,因为它决定了汇编语言的特性。

CPU存储器的读写

CPU想要进行数据的读写,必须知道其存储单元的地址(地址信息),器件的选择,读或写的命令(控制信息),以及读或写的数据(数据信息)。CPU通过总线传输这些信息,总线又分为地址总线,数据总线,控制总线,如图所示在这里插入图片描述
*pc中各类存储器的链接情况
在这里插入图片描述

内存地址空间

在这里插入图片描述

如图可知,每个物理储存器都有一个地址空间,CPU在一个地址读取数据,实际上是在相对应的物理存储器读取数据

寄存器

一个典型的cpu由运算器(负责信息处理),寄存器(负责信息存储),控制器(控制各器件工作),以及内部总线(连接个器件,传输数据)构成,对于汇编语言来说,最重要的是寄存器。

通用寄存器

8086cpu的所有的寄存器都是十六位的,可以存放两个字节,AX,BX,CX,DX这四个寄存器用来存放一般数据,所以被称为通用寄存器,并且由于为了保证兼容,这四个寄存器都是可以拆成两个8位的寄存器来用的

几条汇编指令

mov a,b等价于高级语言的a=b
add a,b等价于高级语言的a=a+b
另外若数据超过寄存器可存储的数值,只留下可以存储的后几位
(但并没有真的丢失,我也不知道去哪里)
进行数据传输或运算的话,应注意指令的两个操作对象是同位的。

物理地址的的给出方法

*16位cpu的特征
在这里插入图片描述
但8086CPU有二十条主线,意味着能传递二十位的地址,然而他说16位的,所以它使用了一种特殊的方法生成二十位的地址
在这里插入图片描述

地址加法器采用物理地址=段地址16+偏移地址的方法计算,若CPU想访问一个地址为123C8的地址,则会通过1230+00C8=123016+00C8=123C8来得到这个地址
*在这里插入图片描述

参与评论 您还未登录,请先 登录 后发表或查看评论
相关推荐

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

remiliasai

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值