经典试题(1)

//20171019

一:

这个题主要考查指针,算的上经典。

struct Test结构体的大小是20byte(十六进制0x14)

所以

p+0x01,此时p还是Test *类型,故根据指针运算规则,p+0x1,p的值实际上是往后移Test *的大小,即0x100000+0x14 = 0x100014

(unsigned long)p+0x01,这里先将p强制类型转换为unsigned long型,则加法运算将其当作一个数来运算,所以为普通的加法,结果自然为0x100000+1 = 0x100001

(unsigned int*)p+0x01,这里先将p强制类型转换为unsigned int*型,即转换为一个unsigned int*的指针,unsigned int占4个字节的大小,则p+0x01往后移4个字节,即0x100000+0x4 = 0x100004

 

这里实际上要理解,在32位机上,指针本身始终只占用4个字节的空间,指针的类型只不过是给编译器解释它的值的时候使用的,什么类型的指针,编译器就知道指针的值所表示的是一个什么结构的数据。

这也是为什么在函数传参时使用指针高效的原因,因为始终只占4个大小的空间,而在函数中可以依据指针的类型将值取出来。

而传值时是拷贝操作,如果一个结构体很大,会很低效。

这些行为都跟编译器有关。

 

二:

int[3][2]={(0,1),(2,3),(4,5)}; 
int*p; 
p=a[0]; 
printf("%d",p[0]);

这里的p[0]为1,因为

int[3][2]={(0,1),(2,3),(4,5)}; 里面的是三个逗号表达式(由后面一个数决定),正常的是{{},{},{}}所以只定义了p[0]={1,3,5},所以这里的答案是p[0] = 1;

三:写一个 “标准
宏 MIN ,这个宏输入两个参数并返回较小的一个。
不用吝啬括号,而且是问号。
 
#include <stdio.h>

#define MIN(A,B) ((A)<=(B)?(A):(B))   //这里注意这个写法,是?

int main()
{
    int a = 1;
    int b = 2;
    int min;
    min = MIN(a,b);
    printf("min in a,b is %d\n",max);
    getchar();
}

 

#define MIN(A,B) ((A) <= (B) ? (A) : (B))
MIN(*p++, b)会产生宏的副作用
剖析:
这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,
在宏展开的时候对“参数”进行的是一对一的替换。程序员对宏定义的使用要非常小心,特别要注意两个问题:
(1) 谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答:
#define MIN(A,B) (A) <= (B) ? (A) : (B)
#define MIN(A,B) (A <= B ? A : B )都应判0分;
(2) 防止宏的副作用。
  宏定义#define MIN(A,B) ((A) <= (B) ? (A) : (B))对MIN(*p++, b)的作用结果是:((*p++) <= (b) ? (*p++) : (b)) 
这个表达式会产生副作用,指针p会作两次++自增操作。除此之外,另一个应该判0分的解答是:#define MIN(A,B) ((A) <= (B) ? (A) : (B));
这个解答在宏定义的后面加“;”,显示编写者对宏的概念模糊不清,只能被无情地判0分并被面试官淘汰。
http://blog.csdn.net/z507263441/article/details/20211205

四:

5. 用变量 a 给出下面的定义
a) 一个整型数( An integer )  int a ;
b) 一个指向整型数的指针(   int *a;
A pointer to an integer
)
c) 一个指向指针的的指针,它指向的指针是指向一个整型数(       int **a;
A pointer to a pointer  
to an integer )
d) 一个有 10 个整型数的数组(   int a[10];
An array of 10 integers
e) 一个有 10 个指针的数组,该指针是指向一个整型数的(     int * a[10];
)
An array of 10 pointers to
integers )
f) 一个指向有 10 个整型数数组的指针(  int (*a)[10]
A pointer to an array of 10 integers
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(   int (*a)(int)
nction that takes an integer as an argument and returns an integer
)
A pointer to a fu
)
h) 一个有 10 个指针的数组, 该指针指向一个函数, 该函数有一个整型参数并返回一个整型   int (*a[10])(int)
数( An array of ten pointers to functions that take an integer argument and r
eturn an integer
)
答案是:
a) int a; // An integer
b) int *a; // A pointer to an integerc) int **a; // A pointer to a pointer to an integer

c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument
and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an int
eger argument and return an integer

 

posted on 2017-10-19 21:51  温怀雄  阅读(179)  评论(0编辑  收藏  举报

导航