第二次课大纲

第一部分指针:首先&运算符以及地址的概念

  1、输出hello world,熟悉编译器devc++

  2、输出一个变量i的值到终端

  3、输入变量i的值并显示在终端上

  4、解释&符号是一个运算符,作用是获取变量i的地址

  1-4内容参考听课笔记:&运算符

  5、解释存储单元的地址和存储单元的内容

存储单元的地址<==>编号<==>十六进制表示

  在C语言里变量存放在内存里,内存是什么呢,就是大家常说的内存条,或者是在买电脑时常说的这个电脑的内存是4G或者8G,甚至是16G,在以后学习专业课时会经常和内存打交道,一般使用下图来表示内存,其中每个小格子就是一个存储单元。计算机会对每一个存储单元从0开始编上号,假设内存只有8个存储单元,编号时候就是000(0),001(1),010(2)....111(7),内存不止8个内存单元,如果是4G需要2的32次方,也就是需要32位的数来对内存单元编码,二进制太长一般使用十六进制来表示地址,那么这些编号就是存储单元的地址,这个地址像一栋大楼的门牌号一样。

  存储单元的大小

  存储单元是一个字节8位,每个字节都有一个地址。整型数据的位数是32位,使用sizeof(i)进行验证。你写好C语言程序,定义了变量i和j,程序在编译的时候,编译器会给i和j分配存储单元,由于i和j占用4个字节,那么i和j的地址指的是首单元的地址。

 

  6、输出变量的地址(%x和%p)

  若输出地址需要格式转换,地址比较标准的格式是%p,那么既然上面我们说地址一般用16进制,也可以使用%x来表示试一下,使用printf(“%x ”,&i)和printf(“%p ”,&i)进行输出地址,结果如下,地址是62fe4c,很大的一个编码。%x和%p的差别就是%p结果比%x多了一些0,位数不一样。%x是将地址转换为一个无符号整型输出,下面使用sizeof输出整型和地址的长度,查看地址和整型的长度是否一样。

    从结果可以看出,地址长度是8个字节,整型的长度是4个字节,也就是说地址是一个8*8=64位,整型是32位,从大小可以看出%p是直接输出地址,%x是将地址转换为32位整型输出到终端。那么在64位机器下,当地址比较大的时候,%x再截取低32位输出,可能会导致地址错误。所以虽然一般情况使用十六进制x%来表示地址,但在使用printf或者scanf时进行格式转换时,需要使用%p作为地址的转换格式

  7、写程序验证:&运算符不能取表达式的地址,&取相邻变量的地址。

      详见听课笔记:&运算符

  8、指针的定义

  通过上面的学习,我们了解到&运算符是取变量的地址,也了解到将地址交给一个整数类型,这个事情不靠谱,那么什么样的类型变量可以存放并表示地址呢?指针!

  8.1指针及指针变量的定义

  指针是一种数据类型,指针类型定义的变量只能存放地址。

  8.2定义指针变量时*的位置 :sizeof()查看p和q的长度。

  8.3引用指针变量时,*是一个运算符

  在定义一个指针变量时,*表示p是一个指针,而在引用指针变量时,*是一个运算符,*作为一个运算符大家不陌生,乘法运算符就是使用*。现在需要把这个*当作一个新的运算符,一个单目的运算符,只有一个操作数,我们用它来访问指针的值所表示的地址上的变量。使用printf("*p=%d ",*p);输出*p的值验证上述说法。在这里可将*p作为一个整体,就是一个整数,一个整数既可以做为左值又可以作为右值。

  8.4用作函数参数的指针

  具体见听课笔记:指针的定义

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  课后总结:从3、写输入一个整数显示在终端程序开始上课,使用函数参数的指针没有讲完,只给了概念。%p和%x的区别没有讲,因为教室电脑是32位的,重点讲解和实验了:内存单元、内存单元的地址,内存单元的大小;指针的定义;引用指针时*运算符。

  总起来说这堂课比第一次好,每次让学生写程序的同时我也写,如果不会就可以参照我写的,这样绝大多数学生都跟着我在操作。因为学生在引用指针时,在指向变量之前给*p=12赋值,然后出错,和http://www.cnblogs.com/c-programing-language/p/6427780.html的新手出现的情况一致,所以把这个问题在本节课讲解了。   

原文地址:https://www.cnblogs.com/c-programing-language/p/6474540.html