当前位置:首页 » 编程语言 » c语言逻辑地址相关题
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言逻辑地址相关题

发布时间: 2022-10-28 13:04:38

c语言 问题

地址映射方面的知识:

首先回答你第一个问题,如果i的地址是2000,这是最初的逻辑地址,真正到最后起指向的内存地址可不是2000,是要进过映射后形成的物理地址。如果你对地址映射的内容感兴趣,那么可以看看我的第3段。

地址映射和硬件有关,我只清楚intel 80386后出现的保护模式,具体细节很繁杂,我只说下大概的过程。首先你的2000地址会经过一次段式地址印射变成线性地址,具体印射过程要有一定知识累积才能看懂,在linux系统里面,这次印射完全不起作用,最后形成的地址还是2000.到第2次页式地址映射变成最终的逻辑地址,鉴于它的重要性,我大致说下过程,在内存有2张对内存管理很重要的表,页面目录表和页面表,32位2进制的地址会被分成10位,10位和12位这3个数,第一个10为做页面目录表的下标,找到一个表项,这个表项指向一个页面表,第2个目录做为表的下标,找到一个表项就成了内存页面起始地址加上最后的12位偏移量就是最终的物理地址。这就是intel保护模式寻址。

所以你看到进过一系列的运算后,2000的数值就会变成其它值,而表里面的值是没人知道的包括操作系统,所以没人能知道它最后变成什么样子。

还是回答你第一个问题吧,i里面地址确实是2000,但进过地址映射后就不知道多少了,但放心只要是一个进程内部,他能访问的页面表被限制了,所以你int * p = 2000;如果你确定i的地址是2000的话,这样写我写过,最后p指向的是i同一块内存,虽然出警告,不要理他。

如果你仔细看的话,我想第2个问题我也回答了,当然你要保证2个变量是同一个进程。下面这样可不行:

int main() {
int a = 10;
}

int main() {
int * b = 2000; //我已经确定了a的地址是2000
}

b可访问不到a,他们不是同一个进程。
可能你没看懂,不过这是我能说的最详细了,(更详细就可以出书了)。没看懂的原因是需要知识的积累。

⑵ 一道c语言逻辑题目,求大神帮一下!

逐一验证即可,伪代码

⑶ 什么是逻辑地址什么是物理地址在实模式下,如何求存储器的物理地址假设一个

逻辑地址和物理地址的区别是:
逻辑地址(Logical Address) 是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel 保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段如果完全一样)。应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。
物理地址(Physical Address) 是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么线性地址就直接成为物理地址了。
虚拟内存(Virtual Memory)是指计算机呈现出要比实际拥有的内存大得多的内存量。因此它允许程序员编制并运行比实际系统拥有的内存大得多的程序。这使得许多大型项目也能够在具有有限内存资源的系统上实现。一个很恰当的比喻是:你不需要很长的轨道就可以让一列火车从上海开到北京。你只需要足够长的铁轨(比如说3公里)就可以完成这个任务。采取的方法是把后面的铁轨立刻铺到火车的前面,只要你的操作足够快并能满足要求,列车就能象在一条完整的轨道上运行。这也就是虚拟内存管理需要完成的任务。在Linux 0.11内核中,给每个程序(进程)都划分了总容量为64MB的虚拟内存空间。因此程序的逻辑地址范围是0x0000000到0x4000000。有时我们也把逻辑地址称为虚拟地址。因为与虚拟内存空间的概念类似,逻辑地址也是与实际物理内存容量无关的。 逻辑地址与物理地址的“差距”是0xC0000000,是由于虚拟地址->线性地址->物理地址映射正好差这个值。这个值是由操作系统指定的。

⑷ C语言的逻辑题

(1)0;因为a+b>c为真,逻辑值是1,但b==c为假,逻辑值是0,&&表示“且”,所以该式值为0。
(2)1;因为a不为0,所以逻辑式a为真,同理b+c也为真,b-c也为真,所以该式值为1。
(3)1;a>b为假,所以!(a>b)为真,c值不为零,所以!c的逻辑值是零,||表示“或”,1&&0||1为1。
(4)0;看后面&&0就知道是0了。
(5)1;!(a+b)的逻辑值是0,所以!(a+b)+c-1==0+5-1==4!=0,而b+c/2也不为零,所以该式为真。

⑸ C语言中 知道逻辑地址 如果计算物理地址

要看具体情况的,这个是根据操作系统的地址映射有关的,操作系统根据可以把逻辑地址映射到不同的·物理地址的,要看具体的映射方法以及不同的操作系统,比如分段和分页方式计算方法是不·一样的。
“物理地址*10H + 偏移地址 和 物理地址*10H + 逻辑地址 是等价的吗?”的说法应该是分段的说法。物理地址*10H + 偏移地址 和 物理地址*10H + 逻辑地址不是等价的:物理地址*10H + 偏移地址=逻辑地址

⑹ c语言的逻辑推理题!!急求!!!

#include<stdio.h>
typedefstruct{
intP,Q,R,S;
}Result;
intcheckPQ(Resultconst*constr){
if(r->P)//ifPistrue,Qmustbetrue.
returnr->Q;
return1;
}
intcheckQR(Resultconst*constr){//Q&&R=false;
return!(r->Q&&r->R);
}
intcheckRS(Resultconst*constr){//R||S=true;
returnr->R||r->S;
}
intcheckSQ(Resultconst*constr){//ifSistrue,Qisfalse
if(r->S)
return!r->Q;
return1;
}
intcheckPQRS(Resultconst*constr){
return2==r->P+r->Q+r->R+r->S;//only2istrue.
}
intmain()
{
Resultr;
for(inti=0;i<16;++i){
intj=i;
r.P=j%2;j/=2;
r.Q=j%2;j/=2;
r.R=j%2;j/=2;
r.S=j%2;
if(checkPQRS(&r)&&checkPQ(&r)&&checkQR(&r)&&checkRS(&r)&&checkSQ(&r))
printf("P=%d,Q=%d,R=%d,S=%d ",r.P,r.Q,r.R,r.S);
}
}

符号化短路略做简化版本:

#include<stdio.h>
typedefstruct{
intP,Q,R,S;
}Result;
intcheckPQ(Resultconst*constr){
returnr->P&&r->Q||!r->P;//ifpistrue,qmustbetrue.
}
intcheckQR(Resultconst*constr){//Qconst*const*R=false;
return!(r->Q&&r->R);
}
intcheckRS(Resultconst*constr){//R||S=true;
returnr->R||r->S;
}
intcheckSQ(Resultconst*constr){//ifSistrue,Qisfalse
returnr->S&&!r->Q||!r->S;
}
intcheckPQRS(Resultconst*constr){
returnr->P+r->Q+r->R+r->S==2;//only2istrue.
}
intmain()
{
Resultr;
for(inti=0;i<16;++i){
intj=i;
r.P=j%2;j/=2;
r.Q=j%2;j/=2;
r.R=j%2;j/=2;
r.S=j%2;
if(checkPQRS(&r)&&checkPQ(&r)&&checkQR(&r)&&checkRS(&r)&&checkSQ(&r))
printf("P=%d,Q=%d,R=%d,S=%d ",r.P,r.Q,r.R,r.S);
}
}

输出结果

P=0,Q=0,R=1,S=1

⑺ 计算机二级C语言选择题及答案(2)

}

printf("%d ",num);

}

程序执行后的输m结果是()。

A.35

B.37

C.39

D.3975

32.以下程序的'输出结果是()。

main()

{char st[20]="hello \";

printf("%d%d ",strlen(st).sizeof(st));

}

A.9 9

B.5 20

C.13 20

D.20 20

33.若有以下的定义:‘int t[3][2];”,能正确表示t数组元素地址的表达式是()。

A.&t[3][2]

B.t[3]

C.t[l]

D.t[2][2]

34.函数fseek(pf,OL,SEEK END)中的SEEK ENE 代表的起始点是()。

A.文件开始

B.文件末尾

C.文件当前位置

D.以上都不对

35.下述程序的输出结果是()。

#include

main()

{ int i;

for(i=l;i<=10;i++)

{if(i*i>=20)&&(i*i<=100))

break;

}

printf("%d ",i*i);

}

A.49

B.36

C.25

D.64

36.若有定义“int b[8],*p=b;”,则p+6表示()。

A.数组元素b[6]的值

B.数组元素b[6]的地址

C.数组元素b[7]的地址

D.数组元素b[o]的值加上6

37.设变量已正确定义,则以下能正确计算f=n!的程序是()。

A.f=0:

for(i=1;i<=n;i++)f*=i:

B.F=1:

for(i=l;i<2n;i++)f*=i:

C.f=l:

for(i=n;i>1;i++)f*=i:

D.f=1;

for(i=n;i>=2;i--)f*=i:

38.下述程序执行的输出结果是()。

#include

main()

{ char a[2][4];

strcpy(a,"are");strcpy(a[1],"you");

a[0][3]=’&’;

printf("%s ",a):

}

A.are&you

B.you

C.are

D.&

39.设x=011050,则x=x&01252的值是()。

A.0000001000101000

B.1111110100011001

C.0000001011100010

D.1100000000101000

40.在“文件包含”预处理语句的使用形式中,当#include后面的文件名用(双引号)括起时,寻找被包含文件的方式是()。

A.直接按系统设定的标准方式搜索目录

B.先在源程序所在的目录搜索,如没找到,再按系统设定的标准方式搜索

C.仅仅搜索源程序所在目录

D.仅仅搜索当前目录

【答案与解析】

1.D。【解析】算法的空间复杂度,是指执行这个算法所需的存储空间。算法所占用的存储空间包括算法程序所占用的空间、输入的初始数据所占用的存储空间、算法执行过程中所需要的额外空间。

2.D。【解析】数据的存储结构是指数据的逻辑结构在计算机存储空间中的存放形式,一种数据结构可以根据需要采用不同的存储结构,用的存储结构有顺序和链式结构。用不同的存储结构,其处理的效率是不同的。

3.D。【解析】所谓的交换排序方法是指借助数据元素之间的互相交换进行排序的一种方法,包括冒泡排序和快速排序,冒泡排序通过相邻元素的交换,逐步将线性表变成有序是一种最简单的交换排序方法。

4.C。【解析】结构化程序设计的原则和方法之一是限制使用GOT0语句,但不是绝对不允许使用GOT0语句。其他三项为结构化程序设计的原则。

5.D。【解析】文件系统所管理的数据文件基本上是分散、相互独立的。相对于数据库系统,以此为基础的数据处理存在3个缺点:数据冗余大、数据的不一致性、程序与数据的依赖性强。

6.C。【解析】面对象的设计方法的基本原理是:使用现实世界的概念抽象地思考问题从而自然地解决问题。它虽强调模拟现实世界中的概念而不强调算法,但是它鼓励开发者在软件开发的过程中从应用领域的概念角度去思考。

7.D。【解析】所谓的后序遍历是指,首先遍历左子树,然后遍历右子树,最后访问根结点,并且在遍历左、右树时,仍然先遍历左子树,然后遍历右子树,最后访问根点。因此,后序遍历二叉树的过程也是一个递归过程。

8.B。【解析】软件的过程设计是指系统结构部件转换成软件的过程描述。

9.A。【解析】①对软,牛开发的进度和费用估计不准确:②用户对已完成的软件系统不满意的现象时常发生;③软件产品的质量往往靠不住;④软件常常是不可维护的;⑤软件通常没有适当的文档;⑥软件成本在计算机系统总成本中所占的比例逐年上升;⑦软件开发生产率提高的速度远远跟不上计算机应用迅速普能及深入的趋势。

10.C。【解析】对象的封装性是指从外面看只能看到对象的外部特性,而对象的内部,其处理能力的实行和内部状态对外是不可见的,是隐蔽的。

11.C。【解析】数据库系统由如下5个部分组成:数据库(DB)、数据库管理系统fDBMS)、数据库管理员(人员)、系统平台之一——硬件平台(硬件)、系统平台之二——软件平台(软件)。其中 DB(DataBase)即数据库,是统一管理的相关数据的集合;DBMS即数据库管理系统,是位于用户与操作系统之间的一层数据管理软件,为用户或应用完程序提供访问DB的方法。由以上可知,选C为正确答案。

12.A。【解析】标识符是由字母、数字或下划线组成,并且它的第一个字符必须是字母或者下划线。B选项int不是表达变量类型的标识符,它不能再用做变量名和函数名。C 选项do是C语言的一个关键字。D选项标识符只能以字母或下划线开始。

13.D。【解析】本题考查逻辑运算符的使用。当“&&”的两个运算对象都是逻辑1时,表达式返回值才是1;“||” 的两个运算对象至少有一个是逻辑1时,表达式返回值也是1,x14.C。【解析】第1个printf函数,格式说明的个数是2,而输出项的个数是3,所以对于多余的输出项k不予输出;第2个printf函数,有两个%说明,第1个%后面的字符要原样输出。本题考查printf函数的格式。①“%x”和“%0”分别表示以十六进制和八进制无符合型输出整型数据(不带前导ox或0);②printf函数中格式说明符之前插入的任何字符都原样输出;③格式说明与输出项的个数,也要相等,如果格式说明的个数少于输出项的个数,则对于多余的输出项不予输出。

15.C。【解析】函数fun(int x,int y)的功能是返回x+y的值。在主函数中,变量a,b,c的初始值分别为1,2,3。因此,逗号表达式“a++,b++,aq b”的值等于5,表达式c++的值为3,调用于函数的表达式为“fun(5,3);”,其返回值等于8。

16.D。【解析】在x=2,y=x+3/2中,3/2=1。2+1= 3,因此表达式的值为3,因为x,y为double型变量,故选择D选项。

17.A。【解析】当x为1时,执行case 1,a自加等于1,因为case 1后没有break,接着执行case 2,此时a的值为2,b自加为1,故选择A选项。

18.D。【解析】本题考梦自增运算符“++”、逻辑与运算符“&&”和逻辑或运算符“||”。自增运算符“++”出现在变量之前,表示先使用变量的值加l,再使用变量的值进行运算;出现在变量之后,表示先使用变量的值进行运算,再使用变量的值加l。当逻辑与运算符“&&’’两边的运算对象都为真时,逻辑表达式的值才为真;当逻辑或运算符“||”只要一个值为1,值就为1。根据运算符的优先级,题中应先计算内层括号中的值。++j是先自加后运算,因此运算时j的值等于3,所以表达式++j=3成立,即表达式的值为1;1与任何数都为进行或(||)运算,结果都为1,因此k=3的表达式i++是先运算后自加,因此运算时i为1,所以i++=1成立,自加1后i=2。if语句的条件为真即“1”,所以输出i、j、k的值分别是2,3,3。

19.A。【解析】本题考查switch语句。当i一1时,执行case 1,因为没有遇到break语句,所以依次往下运行,“a=a+ 2=2,a=a+3=5”;当i=2时,执行case 2,因为没有遇到break语句,所以依次往下执行,“a=a+2=7,a=a+3= 10”;当i=3时,执行case 3,a=a+1=11,因为没有遇到break语句,所以依次往下运行,a—a+2—13,a—a+3一l6:当i=4时,执行default,a=a+3=19,结束循环。

20.C。【解析】只有当3个if条件同时成立,即能够同时被2、3、7整除时,才输出i的值,而从0到50能够同时被2、3、7整除的数只有42,故选择C选项。

21.A。【解析】循环的作用是求行下标从1到2列下标从0到i的元素之和,即s=a[1][0]+a[1][1]+a[2][0]+a [2][1]+a[2][2]=3+4+5+6+0=18。

22.A。【解析】在程序语句中,k的初始值为5,进行第l次while循环后,k自减1为4,非0,执行循环体里的printf语句,输出k,此时k的值变为1。程序执行第2次循环时,k 自减1变为0,为假,退出while循环语句。所以程序的最后结果为1。

23.A。【解析】通过地址来引用数组元素的方法有下列5种:

(1)a[i][j];(2)*(a[i]+j);(3)*(*(a+j)+i);(4)* (a[i][j]);(5)(&aE0][0]q-3*i+j)。故A正确。

24.C。【解析】选项A、B的空间不够;字符串存储要有结束符’’,且要占用一个空间,printf用来输出字符,不能输入字符串。

25.D。【解析】由题目ee线性链表的定义可知,要将q 和r所指的结点交换前后位置,只要使q指向r的后一个结点,p指向r结点,r指向q结点即可。而在选项D由,r-> next=q,这时r指向的节点为q;p->next r,这时p指向的节点为r;q->next=r->next,因为r节点已经指向q,所以执行这个语句后q又指向q,所以选项D不正确。

26.B。【解析】在第1次外层for循环中,首先x++得到x=1。进入到内层for循环,只有循环j的值为奇数时,变量x的值才自加1,所以在内层for循环执行过程中,变量x的值自加两次,当退出内层for循环时,x=3,然后执行x++,得到x=4。在进入执行第2次外层for循环中,首先x++得到x=5。进入到内层for循环,只有循环变量j的值为奇数时,变量x的值才自加1,所以在内层for循环执行过程中,变量X的值自加1两次,当退出内层for循环时,x=7,然后执行x++,得到x=8,所以打印输出变量x的值为8。

27.C。【解析】子函数fun1(double a)的功能是返回a的平方值的整数部分。子函数fun2(double x,double y)的功能是返回X的平方值的整数部分与Y的平方值的整数部分的和。又因为题中变量w的定义为double型,函数fun(2) 的定义为int型,按照各类数值型数据间的混合运算,整型数据被转换为实型数据。所以双精度型变量w的值为5.O。

28.C。【解析】在for循环语句中自变量i从0开始,每次自加2,执行s+=*(t+i)语句,因为C语言规定数组名做表达式相当于数组的首地址,也就是第一个元素的地址。因此,*(t+i)代表数组的第i+1个元素。所以程序运行的结果是1+3+5+7+9=25,即变量S的值等于25。

29.A。【解析】本题在函数int fun(int n)的定义中又出现了对函数fun的调用,所以函数fun是递归函数。因而在主函数中调用x=fun(x)时,当输入10赋给变量x时,递归调用的过程为

fun(10)=10…fun(9)=104-94-fun(8)=104-9+84- fun(7)

=10+9++8++7++fun(6)=10+9++8+7+6+fun (6)

=10+9++8+7+6+5+fun(4)

=10+9++8+7+6+5+4+fun(3)

=10+9++8+7+6+5+4+3+fun(2)

=10+9++8+7+6+5+4+3+2+fun(1)

=10+9++8+7+6+5+4+3+2=55

⑻ C语言题目:输入一个IP地址,判断是否为正确形式

if((a[i]<'0'||a[i]>'9')&&a[i]!='.')//正确形式的时候

这一句,在ASCII表中0是在9前面的,所以应该是a[i]>='0'&&a[i]<='9',中间是逻辑与,这样可以保证只有数字才有效

还有,你的程序逻辑也有点问题,for(i=1;a[i]!='\n';i++),这是从a[1]开始判断,但是,应该是从a[0]开始判断。

再有,这个for循环里面,一开始判断的是输入的段数,你是根据点号判断的,你自己数一下,应该是3个点,但是你却是判断的 j!=4;肯定报错的

还有,判断大于3个数字的那里也有问题,你从始至终都只给b[]赋值过1,而且b[]并未初始化,数组元素值不确定,怎么能b[1]-b[0]>4呢?

⑼ C语言中知道逻辑地址如果计算物理地址

可以这么考虑!先把逻辑地址(H)转换成二进制,前6位为页号p得先转换成10进制为2,取得对应的块号,用块号*1024加上后10位为物理地址。 物理地址转化十进制就是再除以1024等于数A余数B,A为逻辑块号