听翁恺老师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中的迭代器&&生成器&&装饰器
迭代器iterator 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外, ...
- AJAX跨域问题总结
跨域是什么? 首先说下同源,同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同.而跨域就是不同源 ! 能够进行跨域的请求 一般a,img,link[rel=stylesheet], ...
- GridView 翻页 索引超出范围
事件回顾 今天GridView翻页时,又遇到错误:索引超出范围.必须为非负值并小于集合大小. 这是当时的PageIndexChanging和RowCommand两个事件的后台代码 protected ...
- json 的循环输出
json不能用for-of循环,会报错 可以用for-in循环: var json = {'a':'apple','b':'banana','c':'orange','d':'pear'}; for( ...
- #YCB#待做题目与填坑资料
各种填坑资料(qwq) 主席树(by YL)戳 树套树(by ZSY)戳 不要问我这些题咋来的(查大佬的水表呗) 题目列表: [HDU5977]Garden of Eden [BZOJ2752][HA ...
- 【Luogu1373】小a和uim之大逃离(动态规划)
[Luogu1373]小a和uim之大逃离(动态规划) 题面 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布 ...
- Spring入门看这一篇就够了
前言 前面已经学习了Struts2和Hibernate框架了.接下来学习的是Spring框架...本博文主要是引入Spring框架... Spring介绍 Spring诞生: 创建Spring的目的就 ...
- Python模块之hashlib模块、logging模块
一.hashlib模块 hashlib模块介绍:hashlib这个模块提供了摘要算法,例如 MD5.hsa1 摘要算法又称为哈希算法,它是通过一个函数,把任意长度的数据转换为一个长度固定的数据串,这个 ...
- WordPress添加显示和隐藏侧边栏按钮开关
在很多的地方都看见过这种效果,就是在文章页面可以切换显示和隐藏侧边栏功能,感觉还是很有用,比如一篇文章的文字内容过多,那么就可以通过隐藏侧边栏来显示更多的文字便于浏览.比如你可以通过点击我文章标题下方 ...
- 怎么用代码制作WordPress的归档页面
先看看效果,这个是我网站的归档页面:http://www.shenjieblog.com/archives 其实WordPress自带了一个归档的功能,但是只能显示在网页中的某一个部分,但是我想单独制 ...