
华为C语言面试题求解?
intarr[]={1,2,3,4,5,6,7,8};int*p=arr;*(p++)+=123;//?*p+=123;p++;??printf("%d,%d\n",*p...
int arr[] = {1,2,3,4,5,6,7,8};
int *p=arr;
*(p++)+=123; //?*p+=123; p++; ??
printf("%d,%d\n", *p,*(++p)); // *(++p)??
求每步骤详细解析。 展开
int *p=arr;
*(p++)+=123; //?*p+=123; p++; ??
printf("%d,%d\n", *p,*(++p)); // *(++p)??
求每步骤详细解析。 展开
展开全部
第一行,定义数组arr,元素共八个
第二行,定义指针p指向arr数组
此时的*p还是等于arr数组的第0个元素,也就是1
第三行,p++里的++是最后才运算,所以先执行*p+=123,也就是arr的第0个元素被赋值为123
此时arr变成{123,2,3,4,5,6,7,8} ,然后是p++,此时*p已经是等于arr的第1个元素了,也就是2
第四行,在执行printf时,括号里的参数是从右往左的顺序进行读取的,也就是说先执行 *(++p),也就是p先加一再指针,指向的是arr第2个元素3,然后在执行*p,还是3
最后显示的内容就是
3,3
press any key to continue
第二行,定义指针p指向arr数组
此时的*p还是等于arr数组的第0个元素,也就是1
第三行,p++里的++是最后才运算,所以先执行*p+=123,也就是arr的第0个元素被赋值为123
此时arr变成{123,2,3,4,5,6,7,8} ,然后是p++,此时*p已经是等于arr的第1个元素了,也就是2
第四行,在执行printf时,括号里的参数是从右往左的顺序进行读取的,也就是说先执行 *(++p),也就是p先加一再指针,指向的是arr第2个元素3,然后在执行*p,还是3
最后显示的内容就是
3,3
press any key to continue
追问
您回答的堪称完美,非常感谢,就是一点小遗憾 *p+=123 应该*p=124吧
基本都解释清楚了,谢谢了
追答
我自己想的时候还知道是124,写的时候就忘了,哈哈

2024-11-19 广告
快速面试助手是武汉智联世界科技有限公司开发的高效面试工具。它利用人工智能技术,帮助HR和企业快速筛选简历,智能匹配岗位需求,实现初步面试自动化。通过预设问题库和自动评分系统,快速面试助手能大幅提升面试效率,减轻HR负担。同时,它还能提供面试...
点击进入详情页
本回答由面试通提供
展开全部
int arr[] = {1,2,3,4,5,6,7,8};
int *p=arr; 此时p指针指向数组首地址 即值为1的地方
*(p++)+=123; //?*p+=123; p++; ??
上面代码++在后,先获取*p的值为1,与123相加则此时arr数组第一位值arr[0]变为124,然后将p指针向后移动一位,即指向arr数组第二位 值为2的地方 此时*p 为2
printf("%d,%d\n", *p,*(++p)); // *(++p)??
此时输出*p为2 *(++p) ++在前先移动指针到第三位,此时值为3
int *p=arr; 此时p指针指向数组首地址 即值为1的地方
*(p++)+=123; //?*p+=123; p++; ??
上面代码++在后,先获取*p的值为1,与123相加则此时arr数组第一位值arr[0]变为124,然后将p指针向后移动一位,即指向arr数组第二位 值为2的地方 此时*p 为2
printf("%d,%d\n", *p,*(++p)); // *(++p)??
此时输出*p为2 *(++p) ++在前先移动指针到第三位,此时值为3
追问
解释的很清楚。非常感谢。 我解析下您看对不
1. *(p++)+=123 就是
*p+ =123;
p++; //逻辑是您上面所说
2. *(++P) 将当前地址后移一位再取值
如果正确的话。
为什么结果会是3.3. 很奇怪
追答
这个貌似是编译器的不同,会导致结果不同,printf("%d,%d\n", *p,*(++p));
这一行代码 应该是先计算后,就是在*(++p) 运算后,再将两个输出的,就是说两个在输出时p都指向了第三个,两个输出时p指向的地址相同。这个你得去研究研究编译器的输出原理了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int *ptr=arr;
//执行这句后ptr指向arr的首元素,就是1
*(ptr++)+=123;
//先是ptr++,ptr指向arr的第2个元素,再将这个元素值加上123,第二个元素变成130
printf("%d,%d",*ptr,*(++ptr));
//注意在常见的编译器中,函数的参数是从右往左计算的,因此是先计算*(++ptr),ptr指向了arr的第三个元素3,取*后当然是3,再是*ptr,还是3。
//执行这句后ptr指向arr的首元素,就是1
*(ptr++)+=123;
//先是ptr++,ptr指向arr的第2个元素,再将这个元素值加上123,第二个元素变成130
printf("%d,%d",*ptr,*(++ptr));
//注意在常见的编译器中,函数的参数是从右往左计算的,因此是先计算*(++ptr),ptr指向了arr的第三个元素3,取*后当然是3,再是*ptr,还是3。
追问
您头端解释的很茫然。。。
后面解释了结果是3.3 很清楚,知道了很感谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
华为面试题这么简单???!!!当年我怎么遇到的怎么那么难???!!!
追问
那您能提供些题目供讨论吗? 学习学习下,我是网上看到的这个
追答
我不是面试C的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
printf()参数的计算从右向左的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先括号里面先解 p++,先执行再加1,*(p++)+=123,其实就是arr[0]+=123,p=p+1;
printf("%d,%d\n", *p,*(++p)); 此时*p=arr[1]=2, *(++p)=arr[2]=3
输出
2,3
没有编译,不知道我的回答对不对会,希望你能编译了告诉我下,我这边没有编译器。
printf("%d,%d\n", *p,*(++p)); 此时*p=arr[1]=2, *(++p)=arr[2]=3
输出
2,3
没有编译,不知道我的回答对不对会,希望你能编译了告诉我下,我这边没有编译器。
追问
结果是3,3.所以不懂啊
追答
可能与编译器或运行环境有关系吧,可能printf 是右运算的吧。
不过按理说,华为的面试题不会出现这种情况。
不懂了,搞懂了跟我说下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询