美文网首页
1+1 不等于2? 来看这道奇怪的C语言题目

1+1 不等于2? 来看这道奇怪的C语言题目

作者: 代码人生ll | 来源:发表于2019-06-11 10:33 被阅读0次

对于很多C语言初学者来说,指针是一大难题!

但是指针也是c语言的灵魂,离开指针,可能c语言就只能处理小学数学题了。

最后,如果大家如果在自学遇到困难,想找一个C++的学习环境,可以加入我们的C++学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题。


但是指针虽然难,但并没有难到大多数人学不会的程度。C语言面向的使用群体是普通人,而不是智商超群的大佬们。只要用心学习,肯定是可以掌握的。

今天小编又给大家带来一道关于指针的c语言面试题,话不多说上代码:

#include

int main()

{

int vector[2][10] = {

{1,2,3,4,5,6,7,8,9,10},

{11,12,13,14,15,16,17,18,19,20}

};

int(*a)[10] = vector;

printf("%d %d %d %d %d",

**a, **(a + 1), *(*a + 1), *(a[0] + 1), *(a[1]));

return 0;

}

程序首先定义了一个二维数组vector,并使用初始化的方式赋予了1-20的初值。

接着又定义了一个指针a,并令其指向vector。

接下来程序通过指针依次输出5个值。

那么,这个c语言程序的输出是什么呢?

初步分析

显然这题的关键点在于指针a

首先我们要明确一点:在理解指针的时候,要像int char short一样,将它当做一种数据类型。

分析a的定义语句:int(*a)[10] = vector,可以发现a其实是一个 int[10] 类型的数组指针。

那么这个c语言的程序输出结果是什么呢,得到答案最简单粗暴的方式就是直接运行代码:

c语言中的指针移动

不仅仅是c语言,语言中的数据类型其实就是告诉处理器应该如何访问它,这句话是什么意思呢?请看下图:

大家都知道数据在内存中的最小粒度是一个字节,上图假设截取内存中的10个字节,在我的电脑上,c语言类型占用了4个字节,因此int类型指针是逐4个字节访问内存的。

同理,short类型的指针是逐2个字节移动的。char类型的指针是逐字节的移动的。

到这里相信大家都发现了,指针的加减法并不像数学概念中的加减一样严格遵循 1+1 =2。

对于int型指针来说,+1 居然移动了4个字节,对于short型指针来说 +1又只移动了两个字节。

其实分析指针加减法的时候不应该从只从数学角度考虑,比如 1千克 + 1克 也不等于2对吧!

这提醒了我们应该不仅仅考虑数字,还需要考虑单位。

指针的单位就是数据类型。int型指针的单位就是sizeof(int),short型指针的单位就是sizeof(short),这样考虑是不是觉得合理多了。

程序输出分析

明确了指针的加减法处理方式,再来分析程序输出就简单多了。

**a, **(a + 1), *(*a + 1), *(a[0] + 1), *(a[1]))

1 11 2 2 11

我们首先查看一下指针的数据类型(下图截取自vs2019)。

从上图中我们可以清楚地看到a的数据类型就是一个int[10]的数组指针。

那么*a的数据类型就是一个int[10]的数组,显然**a就等价于*(*a+0)

那不就是数组的第0个元素1了吗。

**(a+1)不就相当于指针指向位置的第0个元素吗,也就是11。

再来看第三个,*a的数据类型就是一个int[10]的数组,那么*a+1就相当于移动到这个数组的第1个元素(下标从0开始),也就是2。

第四个数字分析和第三个是类似的,因为 *a等价于a[0],所以此处输出也是2。

第五个数字的分析和第四个是类似的,因为 *(a+1)和a[1]是等价的,输出为11。

相关文章

  • 1+1 不等于2? 来看这道奇怪的C语言题目

    对于很多C语言初学者来说,指针是一大难题! 但是指针也是c语言的灵魂,离开指针,可能c语言就只能处理小学数学题了。...

  • [LeetCode By Go 45]237. Delete N

    这道题目不能用go语言写答案,所以用了C语言 题目 Write a function to delete a no...

  • 创作内容就像撩妹儿,不用点手段怎么行?

    出个脑筋急转弯,念完题目立刻回答,好伐? 问: 1+1在什么情况下不等于2? 答: 在算错的情况下不等于2!不好意...

  • [LeetCode By Go 102]141. Linked

    这道题不能用go写,所以用C语言写的 题目 Given a linked list, determine if i...

  • C语言题目

    猜正数游戏,用户给出要猜的数和至多可猜的次数 代码 输出 求前n项的和 输出 约分最简分式:2/4->1/2 输出...

  • js:C语言经典题目2

    题目描述:青年歌手参加歌曲大奖赛,有10个评委打分,试编程求选手的平均得分(去掉一个最高分和一个最低分)。 题目比...

  • 导弹拦截

    时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 131072K,其他语言262144K 一、题目内容...

  • Dragon

    时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 131072K,其他语言262144K 一、题目内容...

  • 简单排序——CC的神奇背包

    时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 131072K,其他语言262144K 一、题目内容...

  • 简单排序——Laptop

    时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 131072K,其他语言262144K 一、题目内容...

网友评论

      本文标题:1+1 不等于2? 来看这道奇怪的C语言题目

      本文链接:https://www.haomeiwen.com/subject/wwdffctx.html