|
|
|
|
移动端

1.6.1 指针(3)

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

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

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


1.6.1 指针(3)

【真题 65】假设指针变量 p定义为:“int *p = new int[100]”,要释放指针 p所指向的动态内存,应使用语句()。

A.delete p B.delete *p C.delete &p D.delete[] p 答案:D。 operator new和 operator delete函数有两个重载版本,每个版本支持相关的 new表达式和 delete表达式:

1)void* operator new (size_t); //分配一个对象

2)void* operator new [] (size_t); //分配一个数组

3)void operator delete (void*); //释放一个对象

4)void operator delete [] (void*); //释放一个数组

对于 new分配的单个对象的内存空间,回收的时候使用 delete,对于 new[]分配的一组对象的内存空间,回收的时候使用 delete[]。本题中,通过 new分配了一个长度为 100的 int型数组,所以,需要使用 delete []p释放指针 p所指向的动态内存。因此,选项 D正确。

在此,展开讲一个问题,关于 malloc/free与 new/delete的区别。 malloc/free通常应用于 C语言中的内存分配与回收,而 new/delete通常应用于 C++语言的内存分配与回收。相比较 malloc,new 内置了 sizeof、类型转换和类型安全检查功能,对于非内部数据类型的对象而言,new 在创建动态对象的同时完成了初始化工作,如果对象有多个构造函数,那么 new 的语句也可以有多种形式。所以,选项 D正确。

【真题 66】 int (*ptr) (),则 ptr是一维数组的名字。

答案:错误。语句 int (*ptr)()定义了一个指向函数的指针变量。

【真题 67】指针在任何情况下都可进行 >,<,>=,<=,==运算。

答案:错误。不同类型的指针是不能比较的。

【真题 68】定义有数组 int a[10],下面不可以表示 a[1] 的地址的是()。

A.a+sizeof(int) B.&a[0]+1  C.(int*)&a+1 D.(int*)((char*)&a+sizeof(int))

答案:A。

对于选项 A,在 32位机器上, sizeof(int)的值为 4,而 a+sizeof(int) 相当于指针运算 a+4,其中, a

表示的是数组首地址, a+4表示的是 a[4]的地址,而不是 a[1] 的地址。所以,选项 A错误。对于选项 B,&a[0]表示的是取数组首元素地址,而 &a[0]+1表示的是数组首元素地址加 1,即 a+1,根据指针运算可知,即表示的是 a[1]的地址。所以,选项 B正确。对于选项 C,(int*)&a表示数组地址 a被强制类型转换为 int*,然后再加 1,与&a[0]+1等价。所以,选项 C正确。对于选项 D,sizeof(int)=4,数据地址 a首先被转换为 char*类型,然后再加 4,根据指针运算公式可知,向前移动 4*sizeof(char),昀后整个结果被转换为 int*类型,此时表示的正好是 a[1]的地址。所以,

选项 D正确。

【真题 69】 int (*s[10])(int) 表示的是()。

A.指针数组,每个指针指向长度为 1的 int数组

B.指针数组,每个指针指向长度为 10的 int数组

C.函数指针数组,每个指针指向一个 int func(int* param)的函数

D.函数指针数组,每个指针指向一个 int func(int param)的函数

答案:D。

【真题 70】有如下代码:

  1. char fun(char *);  
  2. main()  
  3. {  
  4. char *s = "one", a[5] = {0}, (*f1)(char *) = fun, ch;  

则对函数 fun的调用语句正确的是()。

A.*f1(&a); B.f1(*s); C.f1(&ch) D.ch = *f1(s);要改成(*f1)(s)才正确答案:C。在计算机中,每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称

为函数指针。指向函数的指针变量的一般定义形式为:数据类型 (*指针变量名)(参数表);在使用函数指针的时候,通常需要注意以下内容:

1)函数指针的定义形式中的数据类型是指函数的返回值的类型。

2)区分下面两个语句:

  1. int (*p)(int a, int b); //p 是一个指向函数的指针变量,所指函数的返回值类型为整型  
  2. int *p(int a, int b); //p 是一个函数名,此函数的返回值类型为整型指针 

3)指向函数的指针变量不是固定指向哪一个函数的,而只是表示定义了一个这种类型的变量,它是专门用来存放函数的入口地址的;在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。

4)在给函数指针变量赋值时,只需要给出函数名,而不必给出参数。

例如函数 max的原型为: int max(int x, int y);,指针 p的定义为: int (*p)(int a, int b);,则语句 p = max;的作用是将函数 max的入口地址赋给指针变量 p。此时, p就是指向函数 max的指针变量,也就是说, p和 max都指向函数的开头。

5)在一个程序中,指针变量 p可以先后指向不同的函数,但一个函数不能赋给一个不一致的函数

指针(即不能让一个函数指针指向与其类型不一致的函数)。有如下函数:int fn1(int x, int y); int fn2(int x);,定义如下的函数指针: int (*p1)(int a, int b); int (*p2)(inta); 则:

  1. p1 = fn1; //正确,p2 = fn2;  
  2. p1 = fn2; //产生编译错误 

6)当定义了一个函数指针并让它指向了一个函数后,对函数的调用就可以通过函数名实现,也可以通过函数指针实现(即用指向函数的指针变量调用)。

例如语句:c = (*p)(a, b);,表示调用由 p指向的函数( max),实参为 a与 b,当函数调用结束后,再把得到的函数值赋给 c。

7)函数指针只能指向函数的入口处,而不可能指向函数中间的某一条指令。不能用 *(p+1)来表示函数的下一条指令。

8)函数指针变量常用的用途之一是把指针作为参数传递到其他函数。调用函数指针通常的写法为:(*指针变量 )(参数表)。C/C++也支持缩写,即省去 *:指针变量 (参数表) 就本题而言,对于选项 A,&a的类型为指向有 5个元素的 char类型的数组的指针,与 char*类型不

匹配;另外,由于 ()的优先级比*高,这种写法的意思如下:对函数调用的结果做 *运算。因此,选项 A

错误。对于选项 B,*s的类型为 char,而函数参数为 char*,所以,类型不匹配。因此,选项 B错误。对于选项 C,ch的类型为 char,所以,&char的类型为 char*,类型匹配。因此,选项 C正确。对于选项 D,如果改成 f1 (s)也是正确的,所以,这个描述不是非常精确。因此,选项 D错误。

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

51CTO读书频道二维码


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

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

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

读 书 +更多

SQL应用与开发标准教程

本书主要介绍了SQL的数据库应用和开发技术,内容涉及关系数据库和SQL概述,SQL环境,SQL对于数据表的操作,数据库查询知识,SQL数据的修改...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊