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来得到这个地址
*