使用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. spring boot + vue + element-ui全栈开发入门——基于Electron桌面应用开发

     前言 Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Electron通过将Chromium和Node.js合并到同一个运行时环 ...

  2. shiro的登陆认证(shiro项目中来的一)

    一,图解 二,流程 2.1,创建token令牌,token中有用户提交的认证信息即账号和密码 Subject subject = SecurityUtils.getSubject(); Usernam ...

  3. AI CV 会议2018

    (1) NIPS,  Conference and Workshop on Neural Information Processing Systems, A类顶会 1987年由联结主义学派创建,每年一 ...

  4. [UOJ207]共价大爷游长沙

    UOJ sol 这题真是太神啦! 对于S集合中的每个点对,给他们随机附上一个相同权值. 两个点在边(x,y)的两侧当且仅当一个点在x的子树中,另一个点不在x的子树中(假设x是y的儿子) 维护一下子树点 ...

  5. Spring Boot 文件上传原理

    首先我们要知道什么是Spring Boot,这里简单说一下,Spring Boot可以看作是一个框架中的框架--->集成了各种框架,像security.jpa.data.cloud等等,它无须关 ...

  6. python操作excel常用的方法

    读操作模块安装 pip install xlrd 写操作模块安装 pip install xlwt xlrd读操作 1.打开excel xl = xlrd.open_workbook('test.xl ...

  7. 如何实现类似Oracle中的家族树功能

    先来设计一下表结构: create table city(id varchar(3) , pid varchar(3) , name varchar(10)); 下面我们造几条测试数据: INSERT ...

  8. wifislax中的linset软件钓鱼教程

    wifislax中很多破解wifi密码的工具,下面就来说说里面的linset软件的钓鱼过程,国内很多人知道这个方法,不过没有总结,youtube上视频一大把,我刚才测试了一把,还是打算记录一下攻击过程 ...

  9. python笔记之序列

    str字符串 表达:单引号,双引号,反斜杠 'let\'s go.' #只使用单引号,外部使用单引号,内部单引号用反斜杠 "let's go. " #单双引号混合使用 长字符串 使 ...

  10. ERROR : PHP中错误基础

    1.错误 在进行PHP代码编辑的时候,容易碰到error错误提示,PHP中错误有两种:语法错误.逻辑错误. 2.错误报告类型 Notice : 通知 比如直接使用未定义的变量,这种错误不影响PHP脚本 ...