听翁恺老师mooc笔记(2)-第一个程序--&运算符
使用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)-第一个程序--&运算符的更多相关文章
- 听翁恺老师mooc笔记(16)--程序设计与C语言
问题1:计算机遍布生活的各个方面,若你需要一个功能可以下载APP,我们需要的大部分功能都可以找到对应的APP,如果没有可以自己写一个软件,但是很少人需要这么做,那么我们为什么学习计算机编程语言? 学习 ...
- 听翁恺老师mooc笔记(15)--文件的输入与输出
<>重定向 如果使用标准的printf输出,有一个比较简便的方法,可以将程序的结果写入一个文件.使用<和>符号,将程序运行结果重定向到文件中去,具体使用到的代码如下: ./te ...
- 听翁恺老师mooc笔记(14)--格式化的输入与输出
关于C语言如何做文件和底层操作: 文件操作,从根本上说,和C语言无关.这部分的内容,是教你如何使用C语言的标准库所提供的一系列函数来操作文件,最基本的最原始的文件操作.你需要理解,我们在这部分所学习的 ...
- 听翁恺老师mooc笔记(13)--类型定义和联合
typedef 虽然我们知道使用struct这个关键字定义一个结构类型,然后可以使用该结构类型定义变量.但是每次要使用的时候都需要带着struct这个关键字,那么如何摆脱这个关键字哪?C语言提供了一个 ...
- 听翁恺老师mooc笔记(12)--结构中的结构
结构数组: 和C语言中的int,double一样,一旦我们做出一个结构类型,就可以定义这个结构类型的变量,也可以定义这个结构类型的数组.比如下面这个例子: struct date dates[100] ...
- 听翁恺老师mooc笔记(10)--结构
定义结构: 在程序里,如果想要表达一个数据就需要一个变量,而每个变量又都需要一个类型,之前学过C语言中有int.double.float.char等这些基础类型,还有指针.数组等.如果你要表达的数据比 ...
- 听翁恺老师mooc笔记(8)--字符串2
字符串的赋值 字符串的输入与输出 对C语言的基础类型,比如int.double等类型,scanf.printf有专门的格式转换,而对字符串,scanf.printf使用%s格式字符进行输入与输出.当使 ...
- 听翁恺老师mooc笔记(7)--字符串1
C语言中字符串的定义 如果定义一个字符数组word,并使用大括号对其初始化,如下图所示: 但是这个不是C语言的字符串,只是字符数组,不是字符串,因为不能使用字符串的方式进行计算.那么C语言的字符串长什 ...
- 听翁恺老师mooc笔记(6)--指针运算
指针值加1就是将指针值加上sizeof(指针所指变量的类型) 1+1=2,那么指针加1是加上了1这个数字吗?试一下,在代码中定义了char数组,char也是整数,数组名是ac,ac中有10个元素,0- ...
随机推荐
- python装饰器理解
1.装饰器的作用 在不修改被装饰对象的源代码以及调用方式的前提下为被装饰对象添加新功能 原则: 1.不修改被装饰对象的源代码2.不修改被装饰对象的调用方式 目标: 为被装饰对象添加新功能 2.装饰器的 ...
- 使用WebApiClient请求和管理Restful Api
前言 本篇文章的内容是WebApiClient应用说明篇,如果你没有了解过WebApiClient,可以先阅读以下相关文章: WebApi client 的面向切面编程 我来给.Net设计一款Http ...
- Spring Boot Actutaur + Telegraf + InFluxDB + Grafana 构建监控平台
完成一套精准,漂亮图形化监控系统从这里开始第一步 Telegraf是收集和报告指标和数据的代理 它是TICK堆栈的一部分,是一个用于收集和报告指标的插件驱动的服务器代理.Telegraf拥有插件或集成 ...
- 【Elasticsearch全文搜索引擎实战】之Kibana搭建
1. Kibana介绍 Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索.查看交互存储在Elasticsearch索引中的数据.使用Kibana,可以通过各种图表进行高 ...
- 洛谷P3796 【模板】AC自动机(加强版)(AC自动机)
洛谷题目传送门 先膜一发yyb巨佬 orz 想学ac自动机的话,推荐一下yyb巨佬的博客,本蒟蒻也是从那里开始学的. 思路分析 裸的AC自动机,这里就不讲了.主要是这题太卡时了,尽管时限放的很大了.. ...
- 【BZOJ1877】晨跑(费用流)
[BZOJ1877]晨跑(费用流) 题面 Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在 ...
- [BZOJ1031] [JSOI2007] 字符加密Cipher (后缀数组)
Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作 ...
- Java中高级面试题
一.基础知识: 1)集合类:List和Set比较,各自的子类比较(ArrayList,Vector,LinkedList:HashSet,TreeSet): 2)HashMap的底层实现,之后会问Co ...
- elfinder源码浏览-Volume文件系统操作类(1)
今天看了一个文件管理的java后台源码,elfinder 发现这个东东比我写的代码效率告到不知道哪去了,苦思冥想后还是抽点时间看看吧.. 它实现了我们电脑上的所以关于文件操作的动作,并生成了api开放 ...
- button 和input 的区别及在表单form中的用法
先说一下button 和input的定义: <button> 标签定义的是一个按钮 1.在 <button> 元素内部,您可以放置任何内容,比如文本或图像.这是该元素与使用 & ...