黑马程序员技术交流社区

标题: 京东iOS面试题:二道有关指针的题目 [打印本页]

作者: 叶子哥    时间: 2016-5-9 23:32
标题: 京东iOS面试题:二道有关指针的题目
第一题:
请写出以下代码输出

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


第二题:
写一个标准宏Max,并给出以下代码的输出

1
2
3
4
5
6
int array[5] = {1, 2, 3, 4, 5};
int *p = &array[0];
int max = Max(*p++, 1);
printf("%d %d", max, *p);


欢迎大家讨论,给出你们独特的见解 和 神一般的答案.....

作者: 叶子哥    时间: 2016-5-10 23:14
这样子,,我也是醉了..
作者: 栗海云    时间: 2016-5-10 23:18
给答案啊
作者: 程梦谷    时间: 2016-5-11 18:25
#include<stdio.h> int main() {     int a[5]={1,2,3,4,5};     //int *ptr = (int*)(&a + 1);//此处&a,a是数组地址,&a再取地址,这样不行的,我的理解:如下:     int* q = a;          int* p =(q +1);     int* ptr = p;     printf("%d ,%d",*(a+1),*(ptr+1));     return 0; } 结果;2 ,3
作者: 程梦谷    时间: 2016-5-11 18:30
第一题;
请写出以下代码输出

1
2
3
4
5
int a[5] = {1, 2, 3, 4, 5};
int *ptr = (int *)(&a + 1);
printf("%d, %d", *(a + 1), *(ptr + 1));
我的答案:
#include<stdio.h>
int main()
{
    int a[5]={1,2,3,4,5};
    //int *ptr = (int*)(&a + 1);//此处&a,a是数组地址,&a再取地址,这样不行的,我的理解如下:
    int* q = a;
   
    int* p =(q +1);
    int* ptr = p;
    printf("%d ,%d",*(a+1),*(ptr+1));
    return 0;
}
结果;2 ,3

第二题
写一个标准宏Max,并给出以下代码的输出

1
2
3
4
5
6
int array[5] = {1, 2, 3, 4, 5};
int *p = &array[0];
int max = Max(*p++, 1);
printf("%d %d", max, *p);
我的答案:
/*此处Max没有写成标准宏,只定义了一个Max函数*/
#include <stdio.h>
int Max(int a,int b)
{
    return a>b?1:0;
}
int main(int argc, const char * argv[]) {
    int array[5]={1,2,3,4,5};
    int *p= &array[0];
    int max = Max(*p++,1);
    printf("%d %d",max,*p);
    printf(" \n");
    return 0;
}
结果:0,2
注:请楼主看一下,是否正确,多多交流,谢谢
作者: 叶子哥    时间: 2016-5-11 23:17
程梦谷 发表于 2016-5-11 18:30
第一题;
请写出以下代码输出

第一题:
      分析:ptr是指向int *类型的指针,(int *)(&a + 1) 表示(&a + 1)强制转换成int *类型的指针,(&a + 1)表示对a地址再取地址,然后加1,最后等价于a + 5.
      所以ptr指向的就是a + 5,那么ptr + 1也相当于a + 6,所以最后的*(ptr + 1)就是一个随机值了。

第一题答案: 2, 随机值
作者: 叶子哥    时间: 2016-5-11 23:21
yaomars 发表于 2016-5-11 23:17
第一题:
      分析:ptr是指向int *类型的指针,(int *)(&a + 1) 表示(&a + 1)强制转换成int *类型的指针 ...

第二题:
      当看到宏时,就会想到宏定义所带来的副作用。对于++、–,在宏当中使用是最容易产生副作用的,因此要慎用。
       p指针指向了数组array的首地址,也就是第一个元素对应的地址,其值为1.
宏定义时一定要注意每个地方要加上圆括号
*p++相当于*p, p+.

参考答案:宏定义为:   #define Max(X, Y) ((X) > (Y) ? (X) : (Y))
                输出值为:    1, 2
作者: 2528    时间: 2016-5-12 07:26
考的有点细。
作者: SuperJJ    时间: 2016-5-12 12:29
第一题的答案是,2,3
作者: ming1028    时间: 2016-5-12 13:55
指针这么重要
作者: 程梦谷    时间: 2016-5-15 21:04
yaomars 发表于 2016-5-11 23:17
第一题:
      分析:ptr是指向int *类型的指针,(int *)(&a + 1) 表示(&a + 1)强制转换成int *类型的指针 ...

对,1代表的是单位字节长度,这个单位字节长度正好是数组a的长度,(&a )代表数组a的地址,(int*)(&a+1)
正好移动一个单位字节,
作者: 程梦谷    时间: 2016-5-15 21:06
yaomars 发表于 2016-5-11 23:17
第一题:
      分析:ptr是指向int *类型的指针,(int *)(&a + 1) 表示(&a + 1)强制转换成int *类型的指针 ...

对,1代表的是单位字节长度,这个单位字节长度正好是数组a的长度,(&a )代表数组a的地址,(int*)(&a+1)
正好移动一个单位字节,
作者: 程梦谷    时间: 2016-5-15 21:10
yaomars 发表于 2016-5-11 23:17
第一题:
      分析:ptr是指向int *类型的指针,(int *)(&a + 1) 表示(&a + 1)强制转换成int *类型的指针 ...

嗯,对,*取内容运算符和++的运算符的优先级一样,都具有从右到左的结合性,但是当优先级一样时,就按从左到右的顺序计算,*p++ 即*p,p++;
作者: 程梦谷    时间: 2016-5-15 21:11
SuperJJ 发表于 2016-5-12 12:29
第一题的答案是,2,3

不对,是2,随机值
作者: 程梦谷    时间: 2016-5-15 21:13
ming1028 发表于 2016-5-12 13:55
指针这么重要

嗯,oc 都是在用指针,不管在那,都要用到,尤其数据结构
作者: 程梦谷    时间: 2016-5-15 21:20
yaomars 发表于 2016-5-11 23:17
第一题:
      分析:ptr是指向int *类型的指针,(int *)(&a + 1) 表示(&a + 1)强制转换成int *类型的指针 ...

这道题也可以这样改:
int array[5] = {1, 2, 3, 4, 5};
int *ptr =(int *)(&a+1)
printf("%d %d",*(a+1), *(ptr-1));
这个时候,输出的结果又不同了,是吗?
作者: 617808794    时间: 2016-5-15 21:42
赶紧学习了,现在还什么也不会。要加快学习了
作者: 叶子哥    时间: 2016-5-16 22:18
程梦谷 发表于 2016-5-15 21:20
这道题也可以这样改:
int array[5] = {1, 2, 3, 4, 5};
int *ptr =(int *)(&a+1)

这样的话,结果就是:  2  和  5
作者: 程梦谷    时间: 2016-5-16 23:15
yaomars 发表于 2016-5-16 22:18
这样的话,结果就是:  2  和  5

对,正确,
作者: beamcai    时间: 2016-5-17 01:08
指针的地址的变化。。。第一题应该是2,3





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2