1.定义一个函数指针,指向的函数有两个int形参并且返回一个函数指针,返回的指针指向一个有一个int形参且返回int的函数?
int (*(*F)(int, int))(int)
首先,一个函数指针,指向的函数有两个int形参,这个就是(*F)(int, int),这返回的是一个指针
返回一个函数指针,返回的指针指向一个有一个int形参且返回int的函数;把上面的结果当成一个指针,相当于再做一次上面的步骤,所以结果为:int (* (*F)(int, int))(int)
2.在c++中,
const int i = 0;
int *j = (int *) &i;
*j = 1;
printf("%d,%d", i, *j)
输出是多少?
const修饰的常量值具有不可变性,c++编译器通常会对该变量做优化处理,在编译时变量i的值为已知的,编译器直接将printf输出的变量i替换为0。尽管如此,编译器仍然会为变量i分配存储空间,通过修改内存的hack方式将变量i在内存中的值修改后并不影响printf的输出。
如果将i更改为volatile const int类型的,编译器就不会对变量i做优化,printf输出的结果就为1。
其实对于这个答案,我的linux下的centos做出来的答案是1,1

3.声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是
先看未定义标识符p,p的左边是*,*p表示一个指针,跳出括号,由于[]的结合性大于*,所以*p指向一个大小为10的数组,即(*p)[10]。左边又有一个*号,消释数组的元素,*(*p)[10]表示*p指向一个大小为10的数组,且每个数组的元素为一个指针。跳出括号,根据右边(int *)可以判断( *(*p)[10])是一个函数指针,该函数的参数是int*,返回值是int。
参考 : http://blog.youkuaiyun.com/code_crash/article/details/4854965 点击打开链接
4.有以下表达式:
5 请看一下这一段C++代码,如果编译后程序在windows下运行,则一下说话正确的是?
const修饰的常量值具有不可变性,c++编译器通常会对该变量做优化处理,在编译时变量i的值为已知的,编译器直接将printf输出的变量i替换为0。尽管如此,编译器仍然会为变量i分配存储空间,通过修改内存的hack方式将变量i在内存中的值修改后并不影响printf的输出。
如果将i更改为volatile const int类型的,编译器就不会对变量i做优化,printf输出的结果就为1。
其实对于这个答案,我的linux下的centos做出来的答案是1,1
3.声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是
int (*(*p)[10])(int *)

先看未定义标识符p,p的左边是*,*p表示一个指针,跳出括号,由于[]的结合性大于*,所以*p指向一个大小为10的数组,即(*p)[10]。左边又有一个*号,消释数组的元素,*(*p)[10]表示*p指向一个大小为10的数组,且每个数组的元素为一个指针。跳出括号,根据右边(int *)可以判断( *(*p)[10])是一个函数指针,该函数的参数是int*,返回值是int。
参考 : http://blog.youkuaiyun.com/code_crash/article/details/4854965 点击打开链接
4.有以下表达式:
int a=248, b=4;
int const c=21;
const int *d=&a;
int *const e=&b;
int const * const f =&a;
请问下列表达式哪些会被编译器禁止?
A *c=32
B *d=43
C e=&a
D f=0x321f
E d=&b
F *e=34
int
const
c=
21
;
//变量c的值不能改变
const
int
*d=&a;
//指针变量d指向的值不能改变
int
*
const
e=&b;
//指针的指向不能改变
int
const
*f
const
=&a;
//指针不能改变,指针指向的值也不能改变。
5 请看一下这一段C++代码,如果编译后程序在windows下运行,则一下说话正确的是?
char