还剩3页未读,继续阅读
文本内容:
第章指针7第一单元学习指南本章教学目标掌握如何定义指针变量;掌握如何利用指针变量实现变量和一维数组元素的间接引用;
1.了解二维数组元素的间接引用学会编写一般难度的用间接引用的方式处理变量和一维数组元素的程序,并能上机调试运行
2.学习方法建议仔细阅读本章示例程序,正确理解每条语句的功能,尤其是间接引用变量和数组元素的L语句;可以用图示法展示变量之间的指向及间接引用关系;着手编写一般难度的指针应用程序上机调试运行本章示例程序,并调试运行自己编写的程序,进一步体会指针指向及间接
2.引用语句的功能对于语法错误,采取与前面相同的应对措施避免不同类型的变量之间相互赋值,例如
3.再如int x,*p;float y,*q;p=y;q=x;,int a,*p;*p=a;o对于运行错误,着重检查是否通过未经赋值的指针变量进行间接引用例如
4.int;*p;*p=100o对于逻辑错误,着重检查指针变量的指向关系是否正确,可以用图示法验证变量之间的
5.指向及间接引用关系可以在程序中添加临时性的输出语句,用来输出被间接引用变量的值,对比观察这些变量值的变化是否符合预期记录总结在调试程序的过程中发现的错误以及改正的方法,不断积累编写指针应用程序的直
6.接经验第二单元重点与难点解析语言中〃指针〃和〃指针变量〃有区别吗?
1.c一般来说,内存的地址称之为指针,一个变量在内存的首地址称为该变量的指针,通过指针能找到以该指针为地址的内存单元而指针变量是用来存放内存地址的变量,也可以说指针变量是用来存放指针的变量指针变量有哪些特点?
2.指针是语言中广泛使用的一种数据类型,使用指针变量,可以表示各种数据结构;可以C很方便的引用数组、字符串等等,随着后续章节的学习,你能发现,函数也可以有指针,利用指针可以方便的调用函数所以,利用指针可以编写出精炼且高效的程序,能否正确理解和使用指针编写程序,也是衡量是否真正掌握语言的一个重要标志C定义指针变量时,为什么要有类型?
3.在同一种编译器环境下,一个指针变量所占用的内存空间是固定的,并不会随所指向变量的类型而改变虽然所有的指针占用的字节相同,但不同类型的数值却占用不同的字节数例如,一个int的数据占用个字节,一个的数据占用个字节,而一个的数据占用字节;指4char1double8针变量既可以对地址操作,又可以对该地址存放的数据进行操作,因此,需要知道它所指向的数据类型,以告诉它要访问多少个字节的存储空间在使用指针变量时,我们需要知道地址的具体值吗?
4.在语言中,变量的地址是由系统负责管理和分配的,用户并不需要知道变量地址的具体C值,语言也不允许由用户直接对变量的地址进行指定例如,若有定义则指针C int a
[10],*p=a;变量存放的就是数组的首地址,我们不需要知道该地址的具体值,就可以很方便的通过指P a针变量对数组进行各种操作p a指针都可以进行哪些运算时,两个指针能不能相加?
5.随着后续章节的学习,你会知道,语言中,指针的操作很丰富,具体到指针的运算,归纳C起来,有以下几个方面赋值运算1指针与整数的加法运算2指针与整数的减法运算3两个指针减法运算4但是要注意,由于指针就是内存地址,内存的地址就是内存的编号,所有,两个指针的加法运算是没有任何意义的.假设是一个指针变量,与*有区别吗?6p p++p++正确理解和使用指针,是学习语言的关键,对指针变量操作,一定要清楚,本次操作是C对地址操作还是对该地址中存放的数据操作,如果是一个指针变量,则是对指针操作,p P++既指针加而在中,由于运算符运算级别优先,所以相当于既将该地址存放的数1;*p++*p++,值加lo.假设有定义能否进行运算?7inta
[10],a++语言规定数组名是个常量,不是变量,其值就是整个数组在内存中的首地址,即该C a数组号元素⑼的首地址,因此系统编译时会出现编译错误:即操0a error C2105:++needs l-value,作符需要左值若有定义;利用指针变量则对数组中某个元素的引用都有哪些主要形式?
8.inta
[8],*p=a,p a主要有三种通过循环结合来遍历数组的各个元素1p++a例如:〃for p=a;pa+8;p++printf%d,*p;通过的形式取代2p[i]a[i]例如〃for i=0;i8;i++printf%d,p[i];通过的形式访问数组3*p+i例如〃for i=0;i8;i++printf%d,*p+i;当然也可以通过的形式访问*a+i a[i]o行指针与指针数组有哪些区别?
9.行指针,顾名思义就是指向一行的指针其中应用的最多的,那就是二维数组了,因为二维数组是分行分列的,我们通常把二维数组的每一行的首地址,称之为行指针通过如下形式定义int*p
[10];表示指针变量是行指针变量,该行指针变量每行有个元素p10而指针数组是指该数组每个元素都是用来存放一个指针的数定义格式如下int*p
[10];表示是一个指针类型的数组,数组中共个元素,每个元素都可以存放一个指针p p
10.假设有定义该定义是否正确?10inta
[3]
[3],*p=a;,该定义不正确,会出现编译错误,错误代码表示赋值时类型转换错误errorC2440,因为,上述定义中,是二维数组,因此数组名既是整个数组的首地址,同时也指向第a a,一行的首地址,换言之,此时数组名是一个行指针,而时普通指针变量a p正确定义形式为:int a
[3]
[3],*p
[3]=a;设有为一维数组,则表示哪个元素?若为二维数组,表示什么?
11.a*a+l a*a+l如果为一维数组,则就是如果为二维数组,是行指针,表示数组第二a*a+l a[l],a*a+l a行的行指针,主要,才是疝]⑼**a+l怎么理解指向指针的指针?最多可以定义几级指针?
12.若有定义则定义了两个变量,一个是普通变量另外一个是指针变量当执int x,*p=x;,x,p,行了二后,则指针变量的值就是在内存的首地址此时,我们称指针变量为一级p xp xp指针实际上,一级指针的值也是存放在内存中的,该内存的首地址称之为指针,语言规p pC定,可以再定义一个指针变量,来存放一级指针的指针,这个指针就是指向指针的指针了p指向一级指针的指针叫二级指针,类推之,指向二级指针的指针就叫三级指针……从理论上来讲,可以定义无限多级指针,但是,在实际编写程序时,超过二级指针的程序就很难理解了,所以很少用到超过二级的多级指针另外,每定义一个指针变量都需要分配内存空间,因此随着多级指针的定义,变量的个数也会增多,从而占存储空间会越来越多第三单元典型错误解析直接给指针变量赋常量值
1.通常只能将一个变量的地址值赋给指针变量,而不能直接将一个常量赋给指针变量因为变量的地址应该由系统管理,而不应由用户管理例如int*p;p=1000;*p=99;是不安全的,有可能造成内存数据的破坏正确的写法应该是int*p,a;;p=a/*等价于*p=99;a=99;*/指针变量引用错误
2.定义指针变量时,变量名之前的星号仅表示该变量的类型为指针变量但星号不是变量名的一部分例如int*p,*q,a,b;*p=a;*q=b;是错误的正确的写法应该是int*p,*q,a,b;;p=a q=b;给不确定的间接引用单元赋值
3.定义指针变量后,必须首先使得该指针变量指向明确的变量或动态分配的内存单元,然后才能间接引用该指针变量所指向的变量或动态分配的内存单元否则,有可能对原有内存数据造成破坏例如int*p;*p=100;是不安全的,有可能造成内存数据的破坏正确的写法应该是int*p,a;p=a;/*等价于*p=100;a=100;*/也可以写作int*p;p=int*mallocsizeofint;*p=100;试图将形参的值传递给实参
4.在语言中,只能将实参的值传给对应的形参,而不能将形参的值传给对应的实参单向C参数传递例如,以下程序试图实现在被调函数中交换主调函数中两个变量的值void swapintx intyz{int t;t=x;x=y;y=t;,printf”x=%d,y=%d\n x,y;return;}main{int a,b;a=100;b=200;swapa,b;printfHa=%d b=%d\n a,b;}r z但该程序的输出结果为x=200y=100Aa=100b=200z说明并未实现主调函数中两个变量值的交换因为被调函数返回时,并不将形参的值传回给实参,故形参值的交换不影响实参的值正确的写法应该是x,y a,bvoid swapint*p int*q{int t;zt=*p;*p=*q;*q=t;return;}main{inta,b;a=100;b=200;swapa,b;,printfa=%d,b=%d\n”a,b;}在该程序中,首先将主函数中变量的地址传递给被调函数中的指针变量然后在被调函a,b p,q,数中通过指针变量来间接地访问变量从而达到交换变量值的目的p,q a,b,a,b。
个人认证
优秀文档
获得点赞 0