1、Which of the following calling convention(s) support(s) support variable-length parameter(e.g. printf)?(A)
A、cdecl:C语言的缺省调用约定,允许函数的参数的个数是不固定的
B、stdcall:C++的标准调用方式
C、pascal:
D、fastcall
- 知识点:函数调用约定
2、求输出结果
int a[2][2][3]= { {{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}}};
int *ptr=(int *)(&a+1);
printf(“%d %d”, *(int *)(a+1), *(ptr-1));
答案解析:7 12
&a是个四级指针,指向的是a这样的数组,所以它加1,就会跳过整个数组。
(int )(a+1) 指向数组 a[2] 的第二个元素中的第一个,也就是内部第二层大括号的第一个元素:7
(ptr-1)整个数组的最后一个元素,因为 (int )(&a+1) 指向整个数组的下一个位置
相关题:
int a[5][5];
int (*p)[4];
p = a;//当数组名a 作为右值时,代表的是数组首元素的首地址
问&p[4][2] - &a[4][2]的值为多少?(-4)
p是指向一个包含4 个元素的数组的指针。也就是说p+1
表示的是指针p 向后移动了一个“包含4 个int 类型元素的数组”。这里1 的单位是p 所指向的空间,即4* sizeof(int)
。
所以,p[4]
相对于p[0]
来说是向后移动了4 个“包含4 个int 类型元素的数组”,即&p[4]=&p[0]+4*4*sizeof(int)
。由于p 被初始化为&a[0],那么&p[4][2]=&a[0][0]+ 4 * 4 * sizeof(int)+ 2 * sizeof(int)
。
&a[4][2]=&a[0][0]+4 * 5 * sizeof(int) + 2 * sizeof(int)
&p[4][2]
和&a[4][2]
的值相差4 个int 类型的元素。
3、下面说法正确的是(B)
A、C++已有的任何运算符都可以重载
B、const对象只能调用const类型成员函数
C、构造函数和析构函数都可以是虚函数
D、函数重载返回值类型必须相同
知识点:
A:
C++中不能被重载的操作符 | |
---|---|
. | (成员访问或点操作符) |
?: | (三元操作符或条件操作符) |
:: | (域操作符) |
.* 和 –>* | (指向成员的指针操作符) |
sizeof | (取对象大小操作符) |
typeid | (对象类型操作符) |
B:
const用于修饰函数时,一般是const修饰类的成员函数(函数定义体),表示在函数体中成员变量不能改变;其函数形式为
int ff(void)const;const修饰函数的返回值,用于返回常量;
const修饰函数的返回值,用于返回常量.其函数形式为
const int ff(); //返回的是常量,所以必须这么调用const int a=ff();
关于Const函数的几点规则:
- const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
- const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.
- const成员函数不可以修改对象的数据,不管对象是否具有const性质.
- 加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的
C:构造函数不可以
D:重载的概念是:名称相同,参数个数、次序、类型不同,因此重载对返回值没有要求,可以相同,也可以不同,但是如果参数的个数、类型、次序都相同,名称也相同,仅返回值不同,则无法构成重载
如:
public int A(int i);
public double A(int i);//wrong
而:
public int A(int i):
public double A(double i);//right
4、下面的函数哪个是系统调用而不是库函数 ( read ) ?
printf、scanf、fgetc、read、print_s、scan_s
- 知识点:
系统调用 | 系统调用(system call)运行在用户空间的应用程序向操作系统内核请求某些服务的调用过程。是操作系统内核提供的函数,在内核态运行(kernel mode)。由于系统调用不考虑平台差异性,由内核直接提供,因而移植性较差 |
库函数 | 库函数(library function)是由用户或组织自己开发的,具有一定功能的函数集合,一般具有较好的移植性,通过库文件(静态库或动态库)向程序员提供功能性调用。是在系统调用上的一层包装,运行在用户态(user mode),库函数不光可以在系统调用的基础上包装,也可以在其他库函数的基础上包装,提供更高级的抽象,更强大的功能。比如OGRE对OpenGL的包装,Qt对Xlib的包装。 |
5、malloc函数进行内存分配是在什么阶段?(执行阶段,也就是运行阶段)
6、char * const p, char const * p, const char *p 上述三个的区别,说法错误的是?(AC)
A、char * const p; 常量指针,p的值不可以修改
B、char const * p;指向常量的指针,指向的常量值不可以改
C、const char *p;常量指针,p的值不可以改变
- 知识点:常量指针,可以改变它指向的地址,但不能改变指向的内容,形式:
char const * p
或const char *p
;指针常量,我们可以改变他指向的内容,却不能改变它指向的地址,形式:char * const p
7、分析代码
#include <stdio.h>
#define P_char char* //语句1//预处理阶段执行的
#typedef char* char_P //语句2//编译阶段
char arr[10]="movie";
int main() {
P_char p1, p2;//相当于char* p1; char p2;
char_P p3, p4;//相当于char* p3; char* p4;
const P_char pa;//常量指针,指针可变,指向的值不变
const char_P pb;//指针常量,指针地址不变,指向的值可变
p1=arr;
p2=*(arr + 3);
p3=&(arr[2]);
p4=arr + 4;
printf("%s,%s,%s,%s\n", p1, p2, p3, p4); //语句3:movie,i,vie,e
return 0;
}
知识点:#define和#typedef
define | typedef |
---|---|
编译之前的预处理过程 | 编译过程 |
进行简单的字符串代换(原地扩展),不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如:#define PI 3.1415g26 在预处理不出错,程序中的:area=PI*r*r 会替换为`3.1415g26*r*r出错 | 不是简单替换 ,而是采用如同定义变量的方法那样来声明一种类型。 |
# define int_ptr int *
int_ptr a, b;
//相当于int *a, b; 只是简单的宏替换
typedef int* int_ptr;
int_ptr a, b; //a, b 都为指向int的指针,typedef为int* 引入了一个新的助记符
typedef int * pint ;
#define PINT int *
const pint p ;//指针常量,p不可更改,但p指向的内容可更改
const PINT p ;//常量指针,p可更改,但是p指向的内容不可更改。
pint是一种指针类型 const pint p 就是把指针给锁住了 p不可更改
而const PINT p 是const int *p 锁的是指针p所指的对象