OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5327|回复: 20

一道简单的面试题,数组&指针的关系

[复制链接]

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2019-4-16 10:42:04 | 显示全部楼层 |阅读模式
#include <stdio.h>

int main(int argc, char *argv[])
{
    int array1[3] = {1, 2, 3};
    int *p;

    p = array1;
    p = p + 1;

    printf("p[0] = %d\n", p[0]);
    printf("p[1] = %d\n", p[1]);
    printf("p[2] = %d\n", p[2]);

    p = &array1;   
    printf("p[0] = %d\n", p[0]);

    return 0;
}
我去面试时候,有这么一道笔试题,很简单的数组和指针的关系。但是面试官跟我说,之前面试了有4个人,说了一堆自己做了哪些项目,但是没有一个人针对这道题能很清楚的说出一个让他满意的答案
所以还有很多人水平也很菜,我们慌啥呢~对吧

没有脑袋
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
 楼主| 发表于 2019-4-16 10:55:18 | 显示全部楼层
p = &array1; 这句代码后面再加一句p = p + 1;
没有脑袋
回复 支持 反对

使用道具 举报

4

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2017-11-16
在线时间
159 小时
发表于 2019-4-17 21:58:09 | 显示全部楼层
p[0]=2;
p[1]=3;
p[2]=?
p[0]=2;
是这样吗?p[2]=多少?
回复 支持 反对

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2019-4-17 22:48:09 | 显示全部楼层
p = &array1;编译报错
指针执行数组p = array1;就行了
指向某个变量才使用&
让我们的思维驾驭在电的速度之上!
回复 支持 反对

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
 楼主| 发表于 2019-4-18 11:46:23 | 显示全部楼层
DongInker 发表于 2019-4-17 22:48
p = &array1;编译报错
指针执行数组p = array1;就行了
指向某个变量才使用&

考察的不是数组名就是数组第一个元素的地址这个知识点哦~p = &array1,这句代码不会报错,考察赋值地址给p之后,p = p + 1的结果分析;
没有脑袋
回复 支持 反对

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
 楼主| 发表于 2019-4-18 11:46:50 | 显示全部楼层

编译一下~~~
没有脑袋
回复 支持 反对

使用道具 举报

3

主题

91

帖子

1

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-12-8
在线时间
398 小时
发表于 2019-4-19 01:34:25 | 显示全部楼层
p = array1,是把数组array1的首地址赋给p,此时p的地址就是array1[0]的地址,p+1就是array1的地址。
p = &array1,指把数组array1的地址赋给p,虽然此时的p地址是跟前面一样的,但是p+1的地址就不一样了,此时的p+1的地址应该是array1[3]的地址。
回复 支持 反对

使用道具 举报

3

主题

91

帖子

1

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-12-8
在线时间
398 小时
发表于 2019-4-19 01:41:39 | 显示全部楼层
p = array1,就是把array1数组的首地址赋给p,此时p的地址也就是array1[0]的地址,p+1就是array1[1]的地址。
p=&array1,就是把array1数组的地址赋给p,此时虽然p的地址跟前面一样,但是p+1就不一样了,p+1的地址就是array1[3]的地址。
回复 支持 反对

使用道具 举报

3

主题

91

帖子

1

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-12-8
在线时间
398 小时
发表于 2019-4-19 01:42:24 | 显示全部楼层
p = array1,就是把array1数组的首地址赋给p,此时p的地址也就是array1[0]的地址,p+1就是array1[1]的地址。
p=&array1,就是把array1数组的地址赋给p,此时虽然p的地址跟前面一样,但是p+1就不一样了,p+1的地址就是array1[3]的地址。
回复 支持 反对

使用道具 举报

3

主题

91

帖子

1

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-12-8
在线时间
398 小时
发表于 2019-4-19 01:44:30 | 显示全部楼层
p = array1,就是把array1数组的首地址赋给p,此时p的地址也就是array1[0]的地址,p+1就是array1[1]的地址。
p=&array1,就是把array1数组的地址赋给p,此时虽然p的地址跟前面一样,但是p+1就不一样了,p+1的地址就是array1[3]的地址。
回复 支持 反对

使用道具 举报

3

主题

91

帖子

1

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-12-8
在线时间
398 小时
发表于 2019-4-19 01:45:49 | 显示全部楼层
以为没评论到,发了好多次??
回复 支持 反对

使用道具 举报

4

主题

96

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3518
金钱
3518
注册时间
2018-5-25
在线时间
812 小时
发表于 2019-4-22 14:07:24 | 显示全部楼层
本帖最后由 zdes33ss 于 2019-4-22 14:13 编辑

p[2] 溢出了;

p= &array1--这句话不对,p是指向整形的指针,后面是 int (*)[3]的,类型不匹配,除非强制进行类型转换。


回复 支持 反对

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
 楼主| 发表于 2019-4-22 15:58:42 | 显示全部楼层
zdes33ss 发表于 2019-4-22 14:07
p[2] 溢出了;

p= &array1--这句话不对,p是指向整形的指针,后面是 int (*)[3]的,类型不匹配,除非强制 ...

大体就是这么个意思啦~
没有脑袋
回复 支持 反对

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
 楼主| 发表于 2019-4-22 15:59:54 | 显示全部楼层
NANADGUT 发表于 2019-4-19 01:44
p = array1,就是把array1数组的首地址赋给p,此时p的地址也就是array1[0]的地址,p+1就是array1[1]的地址 ...

优秀~~~
没有脑袋
回复 支持 反对

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2019-4-29 10:58:16 | 显示全部楼层
我覺得有些人只是在紙上不會而已...
在實作上犯這種錯(溢出訪問)也是馬上就修正了

我就中過運算符優先級陷阱的...
考官口試時跟我說 這題寫錯了
我拿過來看一下馬上就問他是不是運算符優先級問題? 然後馬上給他正解
考官看了就回 這樣就沒意思了...本來想考你怎麼debug的
我回他這種bug那麼好抓,執行100次就錯100次
多個條件發生時才觸發的那種bug才難抓, 然後就看他一臉滿意

不過也是要遇到肯檢討考卷的啦, 也遇過很多公司不檢討考卷的,寫錯就掰嚕..
回复 支持 反对

使用道具 举报

37

主题

595

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1572
金钱
1572
注册时间
2017-7-17
在线时间
308 小时
发表于 2019-4-29 14:02:15 | 显示全部楼层
你确定有这样的题,你确定 p = &array1;能编译的过吗。。。这里是有问题的,就算有的编译器报警告不报错,那p也极容易引起内存错误。
回复 支持 反对

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
 楼主| 发表于 2019-4-29 15:09:01 | 显示全部楼层
civic7366 发表于 2019-4-29 10:58
我覺得有些人只是在紙上不會而已...
在實作上犯這種錯(溢出訪問)也是馬上就修正了

就考察思维还有基础知识的掌控能力吧,如果都不能抓住考官想要的点,面试也基本过不了的
没有脑袋
回复 支持 反对

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
 楼主| 发表于 2019-4-29 15:19:18 | 显示全部楼层
candylife9 发表于 2019-4-29 14:02
你确定有这样的题,你确定 p = &array1;能编译的过吗。。。这里是有问题的,就算有的编译器报警告不报错, ...

笔试题又不是让你上机啦,在不用上机时候你能指出错误并且讲出这道题更深远的知识点,那不是很另面试官心情愉悦的事情吗?这就是跟其他面试者的区别呀~
没有脑袋
回复 支持 反对

使用道具 举报

37

主题

595

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1572
金钱
1572
注册时间
2017-7-17
在线时间
308 小时
发表于 2019-4-29 15:57:25 | 显示全部楼层
美丽的时光机器 发表于 2019-4-29 15:19
笔试题又不是让你上机啦,在不用上机时候你能指出错误并且讲出这道题更深远的知识点,那不是很另面试官心 ...

那很明显这就是道找错题,考察点就在于是否理解基本的数据类型咯。
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-5-8
在线时间
3 小时
发表于 2019-5-8 11:26:46 | 显示全部楼层
2 3 x 1
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-5-5
在线时间
1 小时
发表于 2020-1-9 14:02:44 | 显示全部楼层
p = &array1; 这是个病句,p[2] = -858993460,这是编译器生成的结果
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 11:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表