使用devC++写hello world

  第一步:文件-新建-源代码。然后输入“输出hello world”程序:

    注意:写程序时关闭中文输入法,否则语句输入的分号可能会被识别为错误。除了printf外,剩余的代码叫做程序框架,是我们后面所有的程序都需要的。

  第二步:保存时注意修改保存类型,devc++默认是C++文件,需要修改为C。

  第三步:类似魔方的小方块的编译,运行或者编译+运行;或者运行菜单项下的运行、编译;或者F9快捷键。运行时会弹出小黑框,这是程序运行看结果的地方,这个小黑框很多种说法,比如就叫小黑框,终端,命令行,控制台等。

解析printf函数和scanf函数,进而引出指针

  printf函数有双引号,双引号内部的东西是字符串,printf会原封不动的输出到终端,\n表示在输出结果后面换一行。那么如果输出到终端是一个变量的值哪?再main里定义一个变量,给变量一个初值,把这个变量直接写入双引号内吗?

      

  当然不是,变量的输出需要指定格式,如上图。%d的作用是将输出的数据转换为指定的格式然后输出,称为格式声明,格式声明一般以%字符开始。格式指定了,然后指定输出哪一个变量,即逗号后的i。

  现在输入的是一个固定的值,如果想要用户输入一个数直接显示在终端上,那该怎么修改程序?需要加入scanf函数。

      

  scanf函数和printf函数的参数类似,双引号内的内容指定输入数据的格式,将数据存入逗号后的变量内,和printf不一样的是变量前必须添加&符号,如果不添加就会出错,那么这个&符号是什么呢?

  &运算符:

  &(and符号)是C语言的一个运算符,和加减乘除一样是一个运算符,那么&计算什么呢?它的作用是取得变量的地址,所以它的操作数必须是一个变量,&把变量的地址取出来,为什么变量有地址呢?因为C语言的变量是放在内存里面的。

     

  每个变量在内存里都占用一定大小的空间,比如sizeof(i),得到整形变量i所占内存的字节数是4,那么就是说i存放在某一个地方的连续4个字节里,那么存放在哪个地方这个地方就有地址,所以&运算符就是把这个变量的地址拿出来,那这个地址是一个什么样的值呢?我们来试一下:

  输出地址使用%x还是%p:

      

  据说地址用十六进制表示比较方便,所以我们使用%x表示地址的格式,然后取i的地址给%x,输出到终端。我们看下上述程序编译器给我们什么样的结果:0X62fe4c,这是个什么值我们不知道,但是看起来好像是个很大的值。

      

  在编译上述程序的时候,devc++没用给出警告,在有些编译器里会给出如下警告:format ‘%x’ expects type ‘unsigned int’, but argument 2 has type ‘int *’。这个警告是说%x是一种无符号整数类型,而&i的类型是int*。

  我们将地址转换为整型打印到终端,在printf函数格式转换里有个%p,是比较标准的输出地址值,那么我看下和%x的区别:

             

      

  %x是将地址转换为32位整型输出到终端,%p是直接输出地址。使用sizeof输出int和&i,可以看出整型是4个字节,而地址是8个字节。%x是截取了地址的低4个字节,在上述例子中,恰巧高4位都是0,在有些编译器和运行环境中,高位不是0的时候,使用%x输出地址就会出现错误。所以我们一般使用%p格式将地址输出到终端。

  &运算符的运算数只能是变量,不能是表达式。我们试一下,使用&取i++的地址:

      

  这时编译器给出错误提示:lvalue required as unary ‘&’ operand。&需要一个一元的操作数。

  那么&取相邻的变量的地址是怎么样的?

      

  i,j两个变量的地址是相邻的,那么两个变量的地址是什么样呢?输出结果可以看出地址一个是4c,一个是48,这两个值差了多少?c是16进制,相当于十进制的12,差了4,那么我们知道整型占了4个字节,这说明什么问题呢?这说明在内存里这两个变量是紧挨着存放的,如下图,低地址画在下面,i先定义的变量,j是后定义的变量,但是他俩在内存里的位置,i是高地址,j在低地址,这是因为我们以后会讲到C语言的内存模型,这两个变量是分配在内存中一个叫堆栈(stack)的区域,在堆栈里我们分配地址是自顶向下分配的,所以我们可以看到先声明的变量地址更高,而后声明的变量地址更低,但是他们俩是紧挨着的。

      

  数组的地址、数组单元的地址、相邻的数组单元的地址是怎么样的?(一行行解释程序并解释结果。)

      

      

  通过结果我们知道,我们做了一个10个数的数组,&a的值和a是相等的,都等于a[0]第0个元素的地址,而a[1]是第一个元素的地址,相差了4个字节。如果一直看下去会发现相邻的数组单元的地址都差了4.

  上述的例子有什么用呢?转下一篇blog。 

听翁恺老师mooc笔记(2)-第一个程序--&运算符的更多相关文章

  1. 听翁恺老师mooc笔记(16)--程序设计与C语言

    问题1:计算机遍布生活的各个方面,若你需要一个功能可以下载APP,我们需要的大部分功能都可以找到对应的APP,如果没有可以自己写一个软件,但是很少人需要这么做,那么我们为什么学习计算机编程语言? 学习 ...

  2. 听翁恺老师mooc笔记(15)--文件的输入与输出

    <>重定向 如果使用标准的printf输出,有一个比较简便的方法,可以将程序的结果写入一个文件.使用<和>符号,将程序运行结果重定向到文件中去,具体使用到的代码如下: ./te ...

  3. 听翁恺老师mooc笔记(14)--格式化的输入与输出

    关于C语言如何做文件和底层操作: 文件操作,从根本上说,和C语言无关.这部分的内容,是教你如何使用C语言的标准库所提供的一系列函数来操作文件,最基本的最原始的文件操作.你需要理解,我们在这部分所学习的 ...

  4. 听翁恺老师mooc笔记(13)--类型定义和联合

    typedef 虽然我们知道使用struct这个关键字定义一个结构类型,然后可以使用该结构类型定义变量.但是每次要使用的时候都需要带着struct这个关键字,那么如何摆脱这个关键字哪?C语言提供了一个 ...

  5. 听翁恺老师mooc笔记(12)--结构中的结构

    结构数组: 和C语言中的int,double一样,一旦我们做出一个结构类型,就可以定义这个结构类型的变量,也可以定义这个结构类型的数组.比如下面这个例子: struct date dates[100] ...

  6. 听翁恺老师mooc笔记(10)--结构

    定义结构: 在程序里,如果想要表达一个数据就需要一个变量,而每个变量又都需要一个类型,之前学过C语言中有int.double.float.char等这些基础类型,还有指针.数组等.如果你要表达的数据比 ...

  7. 听翁恺老师mooc笔记(8)--字符串2

    字符串的赋值 字符串的输入与输出 对C语言的基础类型,比如int.double等类型,scanf.printf有专门的格式转换,而对字符串,scanf.printf使用%s格式字符进行输入与输出.当使 ...

  8. 听翁恺老师mooc笔记(7)--字符串1

    C语言中字符串的定义 如果定义一个字符数组word,并使用大括号对其初始化,如下图所示: 但是这个不是C语言的字符串,只是字符数组,不是字符串,因为不能使用字符串的方式进行计算.那么C语言的字符串长什 ...

  9. 听翁恺老师mooc笔记(6)--指针运算

    指针值加1就是将指针值加上sizeof(指针所指变量的类型) 1+1=2,那么指针加1是加上了1这个数字吗?试一下,在代码中定义了char数组,char也是整数,数组名是ac,ac中有10个元素,0- ...

随机推荐

  1. Django学习-23-ModelForm

    Model + Form ----> 验证 + 数据库操作 class UserInfo(models.Model): username = models.CharField(max_lengt ...

  2. IOS开发之XCode学习013:步进器和分栏控件

    此文学习来源为:http://study.163.com/course/introduction/1002858003.htm 此工程文件实现功能:  1.定义UIStepper和UISegmente ...

  3. 用.Net Core控制台模拟一个ASP.Net Core的管道模型

    在我的上几篇文章中降到了asp.net core的管道模型,为了更清楚地理解asp.net core的管道,再网上学习了.Net Core控制台应用程序对其的模拟,以加深映像,同时,供大家学习参考. ...

  4. .Net之路,感谢对我深远影响的三位前辈

    为什么要写这篇文章?为什么创立这个站点? 本人大四,学习.Net三年有余,随着近期开始转向对.Net Core的关注,我开始了解到了张善友(www.csharpkit.com).腾飞(www.jess ...

  5. html点小图看大图最快捷的方法

    方法一: <td> <a href="{$vo.show_img}" target="_blank"><img style=&qu ...

  6. jquery实现简单的搜索

    对一个简单的ul列表进行输入框的搜索功能,搜索之前及搜索后显示效果如下: 用到的主要jquery技术有filter()和match()方法以及正则匹配,基础HTML+div设置: <div cl ...

  7. jquery中的事件与应用

    mouseover和mouseenter的区别 mouseenter的定义是当鼠标穿过该元素才会被执行,而mouseover是当鼠标穿过该元素或者其子元素皆会触发该事件 mouseleave一般是与m ...

  8. 【BZOJ3262】陌上花开(CDQ分治)

    [BZOJ3262]陌上花开(CDQ分治) 题解 原来放过这道题目,题面在这里 树套树的做法也请点上面 这回用CDQ分治做的 其实也很简单, 对于第一维排序之后 显然只有前面的对后面的才会产生贡献 那 ...

  9. [Luogu3242][HNOI2015]接水果

    Luogu 我今天做两道整体二分结果全都是BZOJ权限题??? sol 我们抓住"盘子的路径是水果的路径的子路径"这个条件. 考虑每一个盘子路径\((u,v)\),讨论它可以作为哪 ...

  10. 记一次结合PHP多进程和socket.io解决问题的经历

    公司是做棋牌游戏的.前段时间接到一个后台人工鉴定并处理通牌作弊玩家的需求,其中需要根据几个玩家的游戏ID查询并计算他们在某段时间内彼此之间玩牌输赢次数和输赢总额. 牌局数据是存储在日志中心的,他们把牌 ...