两道关于指针的C语言笔试题

实验室的师兄师姐为找工作都在狂做C/C++的笔试题,偶们也掺和了下,做了两道指针方面的,大家一起来看看吧。

1. 求n的值。

int a[20];
char * p1 = (char * )a;
char * p2 = (char *)(a+5);
int n= p2-p1;
答案:20。
解析:int为4个字节,char为1个字节。a是int*型指针,加减运算以4个字节为单位,a+5便会指向第20个字节;而p1,p2是char*型,它们进行加减运算时以1个字节为单位。于是p1指向第1个字节而p2指向第21个字节,于是21-1=20,n的值为20。

2. 求 * p 的值。


int k = 0X123456;
char * p = (char *) &k;
答案:’V’(字符V)
解析:k为int型,32位,0x123456如果写全的话应该是0x00123456。&k为k的地址,指向k的低位。p为char*的指针,它只指向一个字节,于是*p指向的值为0x56,十进制值为86,对应的ASCII码为’V’。

附:深入理解C语言指针的奥秘,没搞明白的同学可以全面的学习下C语言的指针及其一些应用。

30 Replies to “两道关于指针的C语言笔试题”

  1. 第二题 和 计算机存储的方式有关吧
    并不一定每台计算机都是那个结果的
    去 看下 大端小端
    纯属个人看法.

  2. 第二题有问题。
    答案只考虑了小端(little endian, IA的一般都是)
    没有考虑大端。(big endian, Sun的一般是)
    前一段时间去笔试中兴,考到了一个小端的。(题中说是intel的处理器,那就是小端了。)

  3. c++我只会简单修改——也不知道语法直接修改达到目的,然后编译!——也会遇到问题一大堆搜解决之~,编程方面基本忘得一干二净了,闲时休闲玩玩而已了

  4. 第二题容易些
    第一题开始还没反应上来。
    *(a+5)的值 就是a[5]的值。a指针就是a[0]的。&a[5]-&a[0]=5(int)
    我感觉
    类似x=1;y=3;int m=a[x+y];
    x+y下标的计算应该发生在编译阶段 而不是运行时。忘了在那里看过,sizeof(int)这样的函数好像也发生在编译阶段。sizeof()并非真正意义的函数,像操作符。欢迎讨论!

    1. @houkai, 我怎么感觉第一题容易些,呵呵,我第一题一下子看出来了,第二天看了好一会儿;应该就是你说的那样,各种内置类型的长度编译时肯定就已经确定了 😐

Leave a Reply to ABitNo Cancel reply

Your email address will not be published. Required fields are marked *