|
|
|
|
移动端

1.6.1 指针(2)

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍指针。

作者:猿媛之家来源:机械工业出版社|2017-12-06 13:44

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


1.6.1 指针(2)

【真题 54】有以下程序:

  1. void main()  
  2. {  
  3. char *pn[] = { "abcd", "efghe", "ijklij", "mnopmno"};  
  4. char **p;  
  5. p = pn;  
  6. printf("%c\n", *(*(p + 2) + 1));  

程序运行后的输出结果是()。

A.f B.g C.jD.k

答案:C。

本题定义了一个字符串数组 pn,同时定义了一个二级指针 p,通过指针 p来访问字符串数组 pn的

值。p+2表示访问的是 pn中第三个字符串的首地址,然后再加 1,表示访问的是第三个字符串的第二个字符,该值为字符 j。(注意,数组下标都是从 0开始)

【真题 55】设计如下定义: int (*ptr)(),则以下叙述中不正确的是()。

A.ptr是指向一维数组的指针变量

B.ptr是指向 int型数据的指针变量

C.ptr是指向函数的指针,该函数返回一个 int型数据

D.ptr是一个函数名,该函数的返回值是指向 int型数据的指针答案:A、B、D。本题中,“int(*ptr)()”表明 ptr是一个指向函数的指针,该函数的返回值是整型变量。 *ptr两边的

括号非常关键,表示 *和 ptr组合成一个指针变量,然后再和后边的圆括号结合,表示该指针变量 *ptr是一个指向函数的指针变量。如果没有 *ptr两边的括号,“ int* ptr()”则表示 ptr是个函数,该函数返回指向整型数据的指针。所以,选项 A、选项 B、选项 D正确。

【真题 56】有如下代码:

  1. short a[5];  
  2. short *p;  
  3. p =a

如果要访问 a[1]的地址,下面写法正确的是()。

A.++a B.a+1 C.p+1 D.++p 答案:B、C、D。本题中,a是数组名, p是一个指针, a+1、p+1、++p都表示的是 a[1],只有 ++a不合法,所以,选

项 B、选项 C、选项 D都是正确的,只有选项 A是错误的。

【真题 57】对 C语言类型声明语句“ double *const cptr;”的正确解释是 cptr指向的地址不能改变。()。答案:正确。 const在 cptr的前面用来修饰 cptr,是不可变量, cptr是一个指向 double类型的指针,因此,cptr指向的地址不能改变。

【真题 58】有如下代码:

  1. int a[3];  
  2. a[0] = 0; a[1] = 1; a[2] = 2;  
  3. int *p, *q;  
  4. p = a;  
  5. q = &a[2]; 

则 a[q - p] =()。

答案:2。

a[q-p]=a[2]=2。

【真题 59】有一个 32位的机器,则该机器的指针是多少位?答案:要想知道指针是多少位,只要看地址总线的位数就行了。以 80386以后的芯片为例,它们都是 32位的数据总线,所以,指针的位数就是 4个字节了。

【真题 60】 int (*s[10])(int) 表示的是什么?答案:函数指针数组,每个指针指向一个 int func(int param)的函数。

【真题 61】 (void *)ptr和 (*(void**))ptr的结果是否相同?其中 ptr为同一个指针。答案:(void *)ptr 和 (*(void**))ptr值是相同的。

【真题 62】要对绝对地址 0x100000赋值,可以用 (unsigned int*)0x100000 = 1234,那么要是想让程序跳转到绝对地址 0x100000去执行,应该怎么做?答案:*((void (*)( ))0x100000 ) ( );。首先要将 0x100000强制转换成函数指针,即:(void (*)())0x100000,然后再调用它: *((void (*)())0x100000)();,用 typedef可以看得更直观些: typedef void(*)() voidFuncPtr;

*((voidFuncPtr)0x100000)();。

【真题 63】 unsigned char *p1; unsigned long *p2; p1=(unsigned char *)0x801000;  p2=(unsigned

long *)0x810000;请问 p1+5=(),p2+5= ()。

答案:801005; 810014。

这个是十六进制的数字, p2要加 20变为十六进制就是 14。

【真题 64】下列用法错误的是()。

A.typedef void (*FUN)(); B.const int &ra;

C.extern const int array[256]; D.int* a;

答案:B。


对于选项 A,typedef void(*fun)(); 表示定义了一个函数指针的类型。如下例所示:

  1. #include<iostream> 
  2. using namespace std;  
  3. void testF()  
  4. {  
  5. cout<<"hello world"<<endl;  
  6. }  
  7. typedef void(*fun)(); //定义了一个函数指针类型  
  8. int main()  
  9. {  
  10. fun f=testF; //定义一个fun 类型的变量f,并初始化为testF  
  11. f(); //调用函数testF  
  12. return 0;  

程序的运行结果为:

hello World

因此,选项 A正确。

对于选项 B,引用变量在定义的时候必须初始化,不能单独存在。而这个选项中定义了一个引用变量 ra,却没有初始化,因此,选项 B错误。

对于选项 C,extern表示声明的函数或变量可以在本模块或者其他模块中使用(只是声明,不是定义)。如果另外一个模块要引用这个变量,只需包含头文件即可。 const表示常量。extern const int array[256]声明了一个大小为 256的常量数组。因此,选项 C正确。

对于选项 D,定义一个整型指针变量 a。所以,选项 D正确。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Linux命令、编辑器与Shell编程

本书是目前所能找到的最实用、最全面的Linux指南和参考手册,也是唯一一本提供以下全部内容的书籍: 更好更实用的示例覆盖了实际工作中需...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊