《软件技术基础之指针和结构体课件》由会员分享,可在线阅读,更多相关《软件技术基础之指针和结构体课件(24页珍藏版)》请在金锄头文库上搜索。
1、 指针指针 1、内存:由存储单元组成。其特点为存储单元是线性连续的。存储单元的最小单位是 字节。2、内存地址:正如我们的住房都有门牌号码一样,为了访问内存中的某个存储单元,我们也要为它编号,这种编号称为内存地址。利用内存地址我们可以访问该地址标识的存储单元。一、指针的相关基本概念:一、指针的相关基本概念:Byte3、程序中一旦定义了一个变量,该变量在内存中就将占用一定的存储单元。变量占用的存储单元总是n(n0)个连续的字节,开始字节的地址,就是变量的地址也可称为该存储单元的首地址。二、指针的基本概念:二、指针的基本概念: 指针就是变量的地址。与此对应,在C语言中使用一类专门的变量即指针变量来存
2、放变量的地址。因此,指针变量是存放地址数据的变量。 从右图可知,指针变量和一般变量一样,仅仅是变量的内容为变量地址的变量而已。指针变量指针变量pi 变量变量i 变量值 变量地址(指针)变量地址(指针)变变量量地地址址存存入入指指针针变变量量指指向向这里变量和指针变量的类型必须一致。 一般而言,指针变量只能存放某一种数据类型的变量的地址,由此可将指针变量分为:整型指针变量、实型指针变量和字符型指针变量等等,指针变量的类型表明了其指向的存储单元中存放的数据的类型。 当把变量的地址存入指针变量后,我们就认为 这个指针指向了该变量。 指针的定义方式如下: 数据类型名 * 指针变量名;在定义指针时要注意
3、以下几个问题: int *prt1,*ptr2;三、指针变量的定义:三、指针变量的定义: 变量前面的“*”不能省略,如果写成:则表示 ptr2 被定义为整型变量而非整型指针变量。int *prt1,ptr2; 定义中的“*”表示所定义的变量是指针变量,但 指针变量名为ptr1、ptr2而非 * ptr1、* ptr2。 指针变量只能指向定义时所规定类型的变量。如 ptr1、ptr2只能指向整型变量而不能指向实型或 字符型变量。 定义指针变量后,并未确定该变量指向何处。即是 说该变量的值是不确定的,在引用该指针变量前, 必须先让它指向一个变量或在内存中为其分配一个 相应的存储单元。四、指针的四、
4、指针的“&”、“*”和赋值运算:和赋值运算: 取地址运算符&的作用是取变量的地址。如:& i 表示求变量 i 的地址。 引用运算符 * 的作用是取指针指向变量的内容。如: * ptr 表示求指针 ptr 所指向变量的内容。1 、& 取地址运算和 * 引用运算& 运算和 * 运算是一对逆运算。先对变量 i 作取地址运算,其地址值赋给 point,point指针就已指向变量 i, *point的值为3。给*point 赋值相当于给 i 赋值。main( ) int i=3; int *point; point=&i; printf(“*point=%d”,*point); *point=15; p
5、rintf(“i=%d”,i); 2、指针的赋值运算 指针的赋值运算可以是以下两种方式:把地址的值赋给指针变量;把一个指针的值赋给另一个指针。注意: 指针的值为空时,C语言中常用一符号常量 NULL给其赋值。main( ) int i=3,ary5; int *ptr1,*ptr2; ptr1=&i; ary2=*ptr1; ptr1=NULL; ptr2=ary; ptr1=ptr2; main( ) float flt; float *f_ptr=&flt; int *i_ptr=NULL; int *c_ptr=NULL; . 例下面我们来看一个和“&”“*”和指针赋值语句相关的例子 数
6、组在内存中占用连续的存储单元。指针最常见的一种用途就是指向数组元素。当一个指针指向数组元素后,就可以用它灵活、快速地处理数组元素,从而体现出指针的优势。main( ) int *ptr1,*ptr2.*ptr3; int ary5=2,4,8,16,32; ptr1=&ary0; ptr2=&ary3; ptr3=ary; 五、指针和数组:五、指针和数组:(一)、指针和一维数组 C语言中规定数组名代表数组的首地址,即第一个元素的地址。因此ptr3 = ary 等价于 ptr3 = &ary0;当指针指向数组的首地址时,指针可以象数组一样使用。若指针ptr指向了数组ary的首地址,就有:*(pt
7、r+2)、ptr2、ary2、*(ary+2)这四种形式都表示了数组的第三个元素。#includemain( ) int *ptr; int ary5=2,9,5,45,3; ptr=ary; printf(“*(ptr+2)=%dn”,*(ptr+2); printf(“ptr2)=%dn”,ptr2); printf(“ary2)=%dn”,ary2); printf(“*(ary+2)=%dn”,*(ary+2); 但是,指针变量与数组名有区别:指针变量是地址变量,数组名是地址常量。即是说指针变量的内容可以在程序运行的过程中被改变,而数组名一旦被初始化,它的值就不能被改变了。main(
8、) int *ptr,i,ary10; ptr=*i; ary=&i; 例要求先打印一个数组中的各元素,然后逆序再打印一遍。(二)、指针的加减运算:、指针与整型值的加减的结果是使该指针下移或上移整型值所指定个数的存储单元后的地址。存储单元的大小就是该指针的数据类型所需的内存大小。、指针之间不允许加运算。、指针之间的减运算的含义是计算这两个指针相差几个存储单元,其结果是一个整数,可由下式计算:ptr1-ptr2=(ptr1的值-ptr2的值)/sizeof(指针的类型)1、指针的加减运算(+、-):指针的加减运算有两种形式一是指针与整型值的加减运算;另一种是指针与指针的减运算。main( ) i
9、nt *ptr1,*ptr2,x; int ary5=2,4,6,8,10; ptr1=ary; ptr2=ptr1+3; x=ptr2-ptr1; 2、指针的自加减运算(+、-、+=、- =): + + 和 += 运算是将指针下移一个或下几个存储单元; - - 和 - = 运算是将指针上移一个或下几个存储单元。main( ) int *ptr; int ary5=2,4,6,8,10; ptr=ary; ptr+=3; ptr-; ptr-=2; ptr+; (四)、字符指针与字符串:main( ) char string=“Hell0!”; printf(“%sn”,string); ma
10、in( ) char *string=“Hell0!”; printf(“%sn”,string); stringstrstring例:将字符串A复制为字符串B。字符数组和字符指针的使用区别:1、两者中存放的内容不同;stringstring strstrHello0char string10;string = “Hell0!”; char *string;string = “Hell0!”; 2、赋值的方法不同:3、指针变量的值是可以改变的,而数组名是常量。1、指针可以作为函数的参数,这同用数组名作为参数的用法一致:可传递大量数据;可改变参数的值。六、指针和函数六、指针和函数例:用一个函数来
11、实现交换两个数据。#include void swap(int *p1,int *p2);main() int x1,x2; x1=100;x2=200; printf(”x1_old=%d,x2_old=%d,a,b); swap(&x1,&x2); printf(”x1_new=%d,x2_new=%d,a,b); void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; #include void swap(int p1,int p2);main() int x1,x2; x1=100;x2=200; printf
12、(”x1_old=%d,x2_old=%d,a,b); swap(x1,x2); printf(”x1_new=%d,x2_new=%d,a,b); void swap(int p1,int p2) int temp; temp=p1; p1=p2; p2=temp; 2、函数指针:是指向一个函数在编译时被分配的一个函数的入口地址。可以通过一个函数指针来访问该函数。函数指针定义的一般形式: 数据类型 (* 指针变量名)();返回值指针变量是专门用于存放函数入口地址的。给指针变量赋值时,只需给出函数名。用指针变量调用函数时,只需用(* p)代替函 数名即可。对指向函数的指针变量不存在p+n,p+
13、,p 等运算。int max(int x,int y); main( ) int n1,n2,a; scanf(“%d,%d”,&n1,&n2); a=max(n1,n2); printf(“最大值是%dn”,a); int max(int x,int y) int z; if(xy) z=x; else z=y; return z; main( ) int max(int x,int y); int n1,n2,a; int (* p)( ); p=max; scanf(“%d,%d”,&n1,&n2); a=(* p)(n1,n2); printf(“最大值是%dn”,a); int ma
14、x(int x,int y) int z; if(xy) z=x; else z=y; return z; 指针的使用在给编程提供了一个强有力工具,但使用不当却又可能带来编程中最难对付的问题。指针操作不当,可能读写一些未知的内存单元,严重的是写操作时,就有可能将数据写入一些重要的内存单元,导致程序或系统受到破坏。因此使用指针的正确方法是:使用前必须弄清该指针指向那里。指 针 小 结 指针是C语言中的一个重要概念,是C语言的特色。指针就是地址,指针除了有“&”、“*”两个单目运算符之外,还可进行加减和自加减等运算。使用指针可:在函数调用的过程中灵活地修改函数中的被调参量(实参);可提高某些程序的
15、效率;指针可用来实现内存空间的动态分配。 在学习结构之前,我们来考虑这样一个问题,假定要统计某系同学的基本情况,包括每个学生的姓名、年龄、身高、体重和各科成绩等。可以为每个学生的各项数据分别定义 一个变量,诸如:name、sex、age、sore5等,但是这样之后各项数据之间的紧密联系在程序形式是就无法体现出来了。如当我们知道了某个学生的姓名,要查询出他的年龄性别等就显得很不方便。 实际上,C语言允许我们把一组逻辑是相关联的数据组织起来,作为一个整体使用。这就是结构体的概念。 结构是一组可以整体引用的变量。它与数组的区别在于结构的元素(称为结构成员)不必是相同的数据类型,并且结构成员可以分别加
16、以引用,利用结构可以组织起复杂紧凑的数据结构。在程序中使用结构,首先要定义结构类型;然后在定义结构变量。结构类型定义描述结构成员的名称和它们的数据类型。结构变量定义则根据结构类型为所定义的变量分配存储单元。 结构体一、结构类型的定义结构类型定义的一般形式:结构类型定义的一般形式:二、结构变量的定义例如:struct date today,tomorrow;结构的定义和结构变量的定义可以结合进行:例如:struct date nextday=2001,11,10;三、结构变量的初始化四、结构的引用 引用的形式: 结构变量名. 成员名对结构变量today而言,有效的结构成员为year、month、
17、day。那么today. year 、today. month、today. day就是对其各个成员的引用。C语言允许将一个结构变量作为一个整体赋值给另一个同一类型的结构变量。C语言不允许将两个结构变量整体比较,只能逐个成员的进行比较。 另一种引用的形式: 结构指针变量名 成员名定义:struct data * today; today 为指向该结构的指针例:结构例程。 可见,“”和“”操作符分别使用在用指向结构的指针和用结构变量来访问结构中的数据项(成员)时。结 构 体 小 结 结构体是C语言中的一种复杂(构造)类型,它是一种被命名为一个标识符的各种变量的集合。结构的定义确定了结构变量或结构指针的格式,结构是软件设计中实现数据抽象的基础。 本章要求掌握 结构定义的基本概念和方法,结构变量和结构指针的含义以及利用结构变量或结构指针来引用结构成员的基本方法。