第十章指针。
指针使用灵活、方便,并可以使程序简洁、高效、紧凑。可以说,指针是c语言的精髓。
指针涉及数据的物理存储,概念复杂,使用灵活且容易出错,所以较难掌握。学习指针要抓住基本的概念、多用图示分析问题解决问题。
简单地说,地址(内存空间或变量的)-指针;地址变量-指针变量。
变量的地址和指针变量。
地址(指针)、地址变量(指针变量)概念及变量的存取方式。
1、 内存,内存地址(物理存储器的概念-补充)
内存(内部存储器):是由大规模集成电路芯片组成存储器,包括ram、rom。运行中的程序和数据都是存放在内存中的。
与内存相对的是外存,外存是辅助存储器(包括软盘、硬盘、光盘),一般用于保存永久的数据。一定要记住:程序、数据是在内存中由cpu来执行和处理的。
外存上尽管可以保存程序和数据,但是当这些数据在没有调入内存之前,是不能由cpu来执行和处理的。
内存地址:内存是由内存单元(一般称为字节)构成的一片连续的存储空间,每个内存单元都有一个编号。内存单元的编号就是内存地址,简称地址。
cpu是通过内存地址来访问内存,进行数据存取(读/写)。
内存的概念。
2、 变量、变量名、变量的地址、变量值(高级语言的存储器概念-复习)
变量:命名的内存空间。变量在内存中占有一定空间,用于存放各种类型的数据。
变量有下面几个概念:
1) 变量名:变量名是给内存空间取的一个容易记忆的名字。
2) 变量的地址:变量所使用的内存空间的地址。
3) 变量值:在变量的地址所对应的内存空间中存放的数值即为变量的值或变量的内容。
int a;
a=5;a 2008
变量名、变量地址、变量值。
3、 指针、变量的指针和指针变量(重点)
1) 指针:就是 “内存单元的地址”。指针指向一个内存单元。
2) 变量的指针:就是“变量的地址”。变量的指针指向一个变量对应的内存单元。
3) 指针变量:就是地址变量。地址(指针)也是数据,可以保存在一个变量中。保存地址(指针)数据的变量称为指针变量。
指针变量p中的值是一个地址值,可以说指针变量p指向这个地址。如果这个地址是一个变量i的地址,则称指针变量p指向变量i。指针变量p指向的地址也可能仅仅是一个内存地址。
注意:1) 牢记:指针-地址。指针变量-地址变量。
2) 指针变量是变量,它也有地址,指针变量的地址-指针变量的指针(指针的指针)。
p 2002 2008(3000)
a 2008
指针、变量的指针、指针变量。
4、 系统访问变量的两种方式(变量的存取方式)(重点)
1) 直接访问:按地址存取内存的方式称为“直接访问”
a)按变量名直接访问,按变量地址直接访问。 如:a=3; *a)=3;
从系统的角度看不管是按变量名访问变量,还是按变量地址访问变量,本质上都是对地址的直接访问。用变量名对变量的访问属于直接访问,因为编译后,变量名-变量地址之间有对应关系,对变量名的访问系统自动转化为利用变量地址对变量的访问。
b)按地址直接访问(访问内存存储空间)-一般不要这么使用,这里仅为了说明概念。
如:*(int *)2008))=5; 在地址2008保存一个整数。
farptr=(char far *)0xa0000000; *farptr+offs+i1*maxb)=*farbit; 操作显示内存。
2) 间接访问(使用指针变量访问变量)
将变量a的地址(指针)存放在指针变量p中,p中的内容就是变量a的地址,也就是p指向a,然后利用指针变量p进行变量a的访问。
p=&a, *p=3。
int a;
int *p=&a;
p 20022008
a=3;p=3;
a 2008
指针、指针变量。
从变量名获得变量地址用“&”运算符,从地址获得地址指向的数据用“*”运算符。
指针变量的定义。
指针变量的定义格式:
例如:int *pt1, *pt2; 定义两个指针变量pt1,pt2。基类型为整型,即指向的数据类型为整型。
float *f定义指针变量f。基类型为浮点型,即指向的数据类型为浮点型。
char *pc定义pc。基类型为字符型,即指向的数据类型为字符型。
说明:1) c语言变量先定义后使用,指针变量也不例外,为了表示指针变量是存放地址的特殊变量,定义变量时在变量名前加“*”号。
2) 指针变量的基类型(简称:指针变量类型):指针变量所指向数据的类型。
我们知道,整型数据占用2个字节,浮点数据占用4个字节,字符数据占用1个字节。指针变量类型使得指针变量的某些操作具有特殊的含义。比如,pt1++;不是将地址值增1,而是表示将地址值+2(指向后面一个整数)。
3) 指针变量存放地址值,pc机用2个字节表示一个地址,所以指针变量无论什么类型,其本身在内存中占用的空间是2个字节。sizeof(pt1)=sizeof(f)=sizeof(pc)=2。
指针变量的赋值。
指针变量一定要有确定的值以后,才可以使用。禁止使用未初始化或未赋值的指针(此时,指针变量指向的内存空间是无法确定的,使用它可能导致系统的崩溃)
指针变量的赋值可以有两种方法:
1、 将地址直接赋值给指针变量(指针变量指向该地址代表的内存空间)
例如:char far *farptr=(char far *)0xa0000000; 将显存首地址赋值给指针。
float *f=(float *)malloc(4); malloc动态分配了4个字节的连续空间,返回空间首地址,然后将首地址赋值给浮点型指针f。这样浮点型指针f指向这个连续空间的第一个字节。
2、 将变量的地址赋值给指针变量(指针变量指向该变量)
例如:int i,*p; p=&i;
指针变量的引用。
、*运算符。注意是用在指针变量上的,不是“位与”,“乘”运算符。参看附录4。
1、&运算符(取地址运算符):表示取变量的地址。
2、*运算符(指针运算符、间接访问运算符):访问指针变量指向的变量的值。
例10-1:p137
main()
int i=100,j=10; /定义两个整型变量 */
int *pi,*pj; /定义两个整型指针变量 */
pi=&i; /pi->i */
pj=&j; /pj->j */
printf(“%d,%d”,i,j直接访问变量i,j */
printf(“%d,%d”,*pi,*pj); 间接访问变量i,j */结果:
说明:1) “int *pi,*pj; ”语句定义了两个变量pi,pj是指向整型数据的指针变量,但是没指定它们具体指向哪个变量。
2) “pi=&i; pj=&j;”将i,j的地址分别赋值给指针变量pi,pj。也就是说pi,pj分别指向变量i,j。
3) “printf(“%d,%d”,i,j);”使用变量名i,j直接访问变量i,j,这是我们以前常用的方法。
4) “printf(“%d,%d”,*pi,*pj);”使用*pi,*pj访问pi,pj所指向的空间的内容,pi,pj分别指向变量i,j,所以*pi,*pj访问的是变量i,j的值。即使用指针变量pi,pj间接访问变量i,j。“*运算符”是间接访问运算符(与定义时不同,定义指针变量所使用的“*”只表示是指针变量,不是运算符)。
其它的指针使用方面的说明:
1) 指针(指针变量)加1,不是指针的地址值加1,而是加1个指针基类型的字节数。p137.
2) 指针运算符“*”不仅可以用在指针变量上,也可以使用在任何能够获取地址(指针)的表达式上。
如果a<=100,那么&a就是a的地址,也就是*&a=100。
如果pa<=&a,那么取pa所指向变量的内容就是变量a的内容,*pa=a,也就是&*pa=&a。
指针变量作为函数的参数。
变量可以作为函数参数,指针变量同样可以作为函数参数。
指针变量作为函数参数时,同样是从实参单向传递指针变量的内容给形参,只是传递的内容是一个地址值。可以通过这个地址值间接改变实参、形参所共同指向的变量。所以尽管不能改变实际参数地址本身,但是可以间接改变地址所指向的变量。
C语言概述备课笔记
教案 首页 编号 yjsd jwc 17 10编制 徐建琴课题序号授课课时授课章节名称使用教具。1 了解c语言出现的历史背景。2 了解并掌握c语言的基本语法成分。3 掌握c语言程序的结构 书写格式和上机步骤。c语言程序的结构。审核 张德芳授课班级授课形式。第一章c语言概述。批准 史岳雷城职11记辅。...
c 阅读笔记
返回值函数可以用于表达式中。形参列表为空,实参列表也为空函数调用仍需要括号。一旦return语句执行,所有后续语句被跳过。计算结束时马上返回该值。在复制数据后,值参数与是参数再也没有联系,所以值参数不能把任何结果传 用函数。局部变量在函数 块 外不能被访问。c 不允许函数嵌套,不能包含另一个函数体中...
C语言笔记
第一课时。c语言标准格式。include vidomain 以 开头的语句称为预处理指令。include语句不是必须的,但是如果一旦有该语句就必须把它放在文件开始处是standared input output header的缩写standared 标准input 输入output 输出header...