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

栏目: C · 发布时间: 5年前

内容简介:对于很多C语言初学者来说,指针是一大难题!但是指针也是c语言的灵魂,离开指针,可能c语言就只能处理小学数学题了。最后,如果大家如果在自学遇到困难,想找一个C++的学习环境,

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

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

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

1+1 不等于2? 来看这道奇怪的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语言题目

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

c语言中的指针移动

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

1+1 不等于2? 来看这道奇怪的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语言题目

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。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

A Philosophy of Software Design

A Philosophy of Software Design

John Ousterhout / Yaknyam Press / 2018-4-6 / GBP 14.21

This book addresses the topic of software design: how to decompose complex software systems into modules (such as classes and methods) that can be implemented relatively independently. The book first ......一起来看看 《A Philosophy of Software Design》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具