⑴ c语言编译时间接寻址级别不同链表的问题
声明与定义的格式不同。
你在main函数里声明是: struct stu *print(struct stu *head);
而下面的定义是: void print(struct stu *head)
这是老谭那本书里面的吧~
⑵ 这段C语言指针代码为什么编译提示“非法的间接寻址”
你好!!!
int *b[3];这是定义一个指针数组b,数组的每个元素都是指针,即b[0]也是指针
那么既然b[0]是指针变量,此时我们只需把b[0]看成一个指针变量p可以吧,那么p[n]和*(p+n)是等价,b[0]=(int *)(p);就是把数组的a的首地址强制转换给给一个普通的指针变量b[0],即b[0]指向第一行的一个元素,*(b[0]+1)表示第二个元素,即为2,printf("%d",*(*(b[0]+1)+1));修改为printf("%d",*(b[0]+1));才是正确的。
总结,",*(*(b[0]+1)+1)去表示一个简单的指针变量是错误的,所以在编译时期就报错。
⑶ 汇编语言中寄存器间接寻址和寄存器直接寻址有啥本质的区别
MOV AX,[2000H] 就是属于直接寻址 MOV BX,2000H MOV AX,[BX] 属于寄存器间接寻址这两条指令实现功能一样 你应该可以看出它们的区别了吧一个是直接传送,另一个显示寄存到一个寄存器中,然后再传送
⑷ 单片机中汇编语言的间接寻址如何用C语言表达
BUF[x + 0x80] = SBUF;
⑸ 单片机C语言中有没有类似于汇编语言中间接寻址的那种方式
有
把变量定义为 idata 类型时,就是访问间接寻址区的
例如: uchar idata var[4]={0};
⑹ 间接寻址是什么意思,说的详细一些,举个例子
就是给出的数不是操作数本身,而是存放操作数的地址 ,上面都是直接从其他资料上复制过来的,你要是想深入理解的话,建议你看看王爽老师的《汇编语言》
⑺ C语言中指针是不是用汇编的间接寻址实现的
只能说汇编语言中的间接寻址类似于C语言中的指针,但两者实现方式不一定就是能画等号的。
⑻ C语言程序设计实验中汇编程序使用的寻址方式有
又是汇编的。。。
计算机是通过执行指令(由操作码字段和操作数字段组成)序列来解决问题的,因而每种计算机都有一组指令集(指令系统)供给用户使用,寻址就是其中之一(如为了找到操作数)。
寻址方式:1)与数据有关的寻址方式 :
a 立即寻址方式:操作数(立即数)直接存放在指令中,紧跟在操作码,作为指令的一部分,这中寻址方式用来表示常数,它经常用于给寄存器赋初值,且只能用于源操作数字段,不能用于目的操作字段,且源操作数长度与目的操作数长度一致。
b 寄存器寻址方式:操作数在寄存器中,指令用来指定寄存器号,不需要访问存储器来取得操作数,速度较快。
c 直接寻址方式:操作数的有效地址(在8086里把操作数的偏移地址叫做有效地址)只包含位移量一种成分,其值就存放在代码段中指令的操作码之后,位移量的指即操作数的有效地址。适用于处理单个变量。
d 寄存器间接寻址方式:操作数的有效地址只包含基址寄存器内容或变址寄存器内容一种成分,因此有效地址就在某个寄存器中,而操作数就在存储器中。适用与表格处理,执行完一条指令后,只需修改寄存器的内容就可以取出表格下一项。
e 寄存器相对寻址方式:操作数的有效地址即为基址或变址寄存器和指令中指定的位移量之和。
f 基址变址寻址方式:操作数的有效地址是一个基址寄存器和一个变址寄存器之和。
g 相对基址变址寻址方式 h 比例变址寻址方式 等等。
2)与转移地址有关的寻址方式。
a 段内直接寻址:转向的有效地址是当前IP寄存器的内容和指令中指定的8位或16位位移量之和。
b 段内间接寻址:转向有效地址是一个寄存器或是一个存储单元的内容 。(常用)
c 段间直接寻址 d 段间间接寻址
此外 还介绍一些寄存器 如通用寄存器 AX BX CX DX 也可叫做数据寄存器,可以以字或字节的形式访问, 另外 SP BP SI DI 四个16位寄存器可以像数据寄存器一样在运算时存放操作数,但他们只能以字(16位)为单位使用,此外它们更经常的用途是在存储器寻址时,提供偏移地址,再者有四个专门提供段地址的寄存器,称为段寄存器 有代码段CS 数据段DS 堆栈段SS 附加段ES。
⑼ C语言中直接访问数据方式和间接访问数据方式的区别
你是想问直接寻址和间接寻 址的区别吗?
C语言表达上没太大区别。
uint16 x=100; 片内直接寻址
xdata uint16 x=100; 片外间接寻址
编译后汇编有区别。直接是mov指令,间接是movx指令
⑽ C语言中对指向多维数组的指针数组中多维数组元素的间接寻址问题
可以从一维数组开始看最简单。
int *a = new int[5];
a代表第一个元素的地址,所以第一个后面第n个可以用 *(a+n);
二维数组
int **a = new int[5][5];
a[i] 相当于一维数组里的 a, 它代表指向第一行元素的一个数组指针。
即:
a[i] ( *a ) 是 int* 型
所以指向第 2 行 数组 的指针: *(a+1)
指向第 i 行 第 j 列 数组 元素 的指针 (从0开始算) *( *(a+i) + j ) 或者 *( a[i] + j )