欢迎来到天天文库
浏览记录
ID:58744772
大小:588.50 KB
页数:144页
时间:2020-10-03
《清华谭浩强C语言课件教学PPT第10章 指针.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第十章指针主要内容10.1地址和指针的概念10.2变量的指针和指向变量的指针变量10.3数组与指针10.4字符串与指针10.5指向函数的指针10.6返回指针值的函数10.7指针数组和指向指针的指针10.8有关指针的数据类型和指针运算的小结10.1地址和指针的概念(1)计算机硬件系统的内存储器中,拥有大量的存储单元(容量为1字节)。为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的“地址”。每个存储单元都有一个惟一的地址。1.内存地址──内存中存储单元的编号(2)在地址所标识的存储单元中存放数据。注意:内存单元的地址与内存单元中的数据是两个完全不同的概念。2.变量地址
2、──系统分配给变量的内存单元的起始地址假设有这样一个程序:main(){intnum;scanf("%d",&num);printf("num=%d",num);}C编译程序编译到该变量定义语句时,将变量num登录到“符号表”中。符号表的关键属性有两个:一是“标识符名(id)”,二是该标识符在内存空间中的“地址(addr)”。为描述方便,假设系统分配给变量num的2字节存储单元为2000和2001,则起始地址2000就是变量num在内存中的地址。3.变量值的存取──通过变量在内存中的地址进行系统执行“scanf(”%d“,&num);”和“printf(”num=%d“
3、,num);”时,存取变量num值的方式可以有两种:(1)直接访问──直接利用变量的地址进行存取1)上例中scanf(“%d”,&num)的执行过程是这样的:用变量名num作为索引值,检索符号表,找到变量num的起始地址2000;然后将键盘输入的值(假设为3)送到内存单元2000和2001中。此时,变量num在内存中的地址和值2)printf("num=%d",num)的执行过程,与scanf()很相似:首先找到变量num的起始地址2000,然后从2000和2001中取出其值,最后将它输出。(2)间接访问──通过另一变量访问该变量的值C语言规定:在程序中可以定义一种特殊的变
4、量(称为指针变量),用来存放其它变量的地址。例如,假设定义了这样一个指针变量num_pointer,它被分配到4000、4001单元,其值可通过赋值语句“num_pointer=#”得到。此时,指针变量num_pointer的值就是变量num在内存中的起始地址2000.通过指针变量num_pointer存取变量num值的过程如下:首先找到指针变量num_pointer的地址(4000),取出其值2000(正好是变量num的起始地址);然后从2000、2001中取出变量num的值(3)。在C语言中,指针是一种特殊的变量,它是存放地址的。(3)两种访问方式的比较两种访问方式
5、之间的关系,可以用某人甲(系统)要找某人乙(变量)来类比。一种情况是,甲知道乙在何处,直接去找就是(即直接访问)。另一种情况是,甲不知道乙在哪,但丙(指针变量)知道,此时甲可以这么做:先找丙,从丙处获得乙的去向,然后再找乙(即间接访问)。指针和指针变量的定义:一个变量的地址称为该变量的“指针”。例如,地址2000是变量i的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。上述的i_pointer就是一个指针变量。为表示指针变量和它指向的变量之间的关系,用指针运算符“*”表示。例如,指针变量num_pointer与它所指向的变量num的关系,表示为:
6、*num_pointer,即*num_pointer等价于变量num。因此,下面两个语句的作用相同:num=3;/*将3直接赋给变量num*/num_pointer=#/*使num_pointer指向num*/*num_pointer=3;/*将3赋给指针变量num_pointer所指向的变量*/10.2变量的指针和指向变量的指针变量10.2.1定义一个指针变量定义指针变量的一般形式为基类型*指针变量名;下面都是合法的定义:float*pointer_3;char*pointer_4;可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。例如:po
7、inter_1=&i;pointer_2=&j;在定义指针变量时要注意两点:指针变量前面的“*”,表示该变量的类型为指针型变量。例:float*pointer_1;指针变量名是pointer_1,而不是*pointer_1。(2)在定义指针变量时必须指定基类型。需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。下面的赋值是错误的∶floata;int*pointer_1;pointer_1=&a;10.2.2指针变量的引用注意:指针变量中只能存放地址(指针),不要将一个整
此文档下载收益归作者所有