• 经典试题(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
    ",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

     
  • 相关阅读:
    005 ES的文档一些控制
    004 REST风格中在ES中的约定
    003 接触elasticsearch的Restful Api【快速入门】
    002 elasticsearch中的一些概念
    001 centos7下安装kibana
    000 centos7下安装elasticsearch7的单节点安装
    006 DOM节点操作与元素的创建
    006 认识BeanNameAware
    005 Spring和SpringBoot中的@Component 和@ComponentScan注解
    004 JpaRepository,CrudRepository,PagingAndSortingRepository的区别
  • 原文地址:https://www.cnblogs.com/wenzong/p/7695671.html
Copyright © 2020-2023  润新知