11等于2⽤c语⾔怎么编辑,1+1不等于2?来看这道奇怪的C语
⾔题⽬
对于很多 C语⾔ 初学者来说,指针是⼀⼤难题!
但是指针也是c语⾔的灵魂,离开指针,可能c语⾔就只能处理⼩学数学题了。
数学数组的定义是什么最后,如果⼤家如果在⾃学遇到困难,想⼀个C++的学习环境, 可以加⼊我们的C++学习圈,点击我加⼊吧 ,会节约很多时间,减少很多在学习中遇到的难题。
但是指针虽然难,但并没有难到⼤多数⼈学不会的程度。C语⾔⾯向的使⽤体是普通⼈,⽽不是智商超的⼤佬们。只要⽤⼼学习,肯定是可以掌握的。
1+1 不等于2? 来看这道奇怪的C语⾔题⽬
今天⼩编⼜给⼤家带来⼀道关于指针的c语⾔⾯试题,话不多说上代码:
include
int main()
{
int vector2 = {
{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语⾔的程序输出结果是什么呢,得到答案最简单粗暴的⽅式就是直接运⾏代码:
1+1 不等于2? 来看这道奇怪的C语⾔题⽬
c语⾔中的指针移动
不仅仅是c语⾔,语⾔中的数据类型其实就是告诉处理器应该如何访问它,这句话是什么意思呢?请看下图:
1+1 不等于2? 来看这道奇怪的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)。
1+1 不等于2? 来看这道奇怪的C语⾔题⽬
从上图中我们可以清楚地看到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。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论