2012程序员考试强化

上传人:kms****20 文档编号:40531570 上传时间:2018-05-26 格式:DOC 页数:12 大小:106.50KB
返回 下载 相关 举报
2012程序员考试强化_第1页
第1页 / 共12页
2012程序员考试强化_第2页
第2页 / 共12页
2012程序员考试强化_第3页
第3页 / 共12页
2012程序员考试强化_第4页
第4页 / 共12页
2012程序员考试强化_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《2012程序员考试强化》由会员分享,可在线阅读,更多相关《2012程序员考试强化(12页珍藏版)》请在金锄头文库上搜索。

1、1指指 针针 (一)变量的指针和指向变量的指针变量(一)变量的指针和指向变量的指针变量1、变量的指针就是指变量的地址。、变量的指针就是指变量的地址。2、指针变量:用来专门存放地址的变量、指针变量:用来专门存放地址的变量例如:int a=5,*p=*代表取后面所表示的地址中的内容。3、通过指针引用数组元素。、通过指针引用数组元素。定义一个指向数组元素的指针 p,然后将一个存在的数组的首地址给 p,然后就可以通过 p 来引用数组中的元素。C 中规定:如果指针变量 p 已指向数组中的一个元素,则 p+1 指向同一数组中的下一个元素(而不是将p的值简单加1) 。例如:数组元素是实型,每个元素需要占 4

2、 个字节,则 p+1 意味着使 p 的值(地址)加 4 个字节,以使它指向下一个元素。我们看一个例子:int a10,*p=a;(1)p+I 和 a+I 就是 aI的地址,即,p+I,a+I,而数组名则不允许,如:a10中,a 代表数组 a的首地址,如果可以自加运算的话,也就是数组在内存中存放的位置是随意变化的这是不可能的,因为只要分配空间后,不可能再移动的。故:a+是错误的。(2)要注意指针变量当前值。因为指针在移动后,如果不进行复位,则它不能象数组名一样每次使用时都代表首地址,故当指针移动时可能超出范围。(3)指针变量的运算p+使 p 指向下一个元素。*p+,由于+和*同优先级,结合方向为

3、自右向左,因此它等价于*(p+)。作用是:先得到 p指向的变量的值(即*p) ,然后再使 p+1p。*(p+)与*(+p)作用不同。前者是先取*p,后使 p 加 1;后者是先使 p 加 1,再取*p。(*p)+表示 p 所指向的元素值加 15、指向多维数组的指针和指针变量、指向多维数组的指针和指针变量(1)多维数组的地址。 (以二维数组为例)这里我们可以将二维数组看成一维数组的一维数组。如:int a1010;对第一行:a0I:可以看成是数组名为 a0的一维数组。其它的同理。故如果写出 a0+1,当然就代表 a 数组中的第二行的首地址,而不是 a 数组中的第二个元素的地址。*(a0+1)同样代

4、表第二行的首地址,只是此时将该表达式加 1 时,不是在跑到下一行啦,而是在本行朝后移一个,也就是下一个元素的地址啦。下表小结:36、字符串的指针和指向字符串的指针变量、字符串的指针和指向字符串的指针变量(1)字符串的指针:指字符串的首地址。(2)字符串的表示形式用字符数组存放一个字符串。如:char str1=”china”,str2=“china”,str3=a,b,0用字符指针指向一个字符串。如:char*str1=”china”;char*str1;str1=”china”;这里是指将字符串的首地址赋给 str1;注意:char*a;scanf(“%s”,a);这种方法C不会提示错误,但

5、是不允许的,因为指针变量 a,定义了,但没有指它指定具体的空间,故无法正确存放你输入的字符串。7、指针运算小结、指针运算小结指针变量加(减)一个整数C 语言规定,一个指针变量加(减)一个整数并不是简单地将指针变量的原值加(减)一个整数,而是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数相加(减) 。如 p+I 代表地址计算:如果 p 为整型,则该式代表 p+I*2;指针变量赋值将一个变量地址赋给一个指针变量。Int*p,a=100;p=指针变量可以有空值,即该指针变量不指向任何变量,表示成 p=NULL,其中 NULL 是整数 0.两个指针变量可以相减如果两个指针变量指向

6、同一个数组元素,则两个指针变量值之差是两个指针之间的元素个数,但两个指针变量相加就没有实际意义啦。两个指针变量比较若两个指针指向同一个数组元素,则可以进行比较。结构体结构体 结构体属于构造类型,前面我们已学过的数组,它中间的各元素是属于同一类型的。但这远远不足,我们大量的是需要同一个数据中能包含多个不同类的数据,这就是结构体产生的原因。结构体的定义:Struct 结构体名/结构体名是用作结构体类型的标志它不等于变量名成员表列;41、结构体类型变量的定义、结构体类型变量的定义struct dateint day;int month;int year;struct studentint num;/

7、学号char name20;struct date birthday;/属于结构体类型的student1,student2;或者:struct student student1,student2其内存空间:2+1*20=22 字节注:对结构体中的成员(即“域” ) ,可以单独使用,它的作用与地位相当于普通变量。成员也可以是结构体变量。2、结构体变量的引用、结构体变量的引用(1)不能将一个结构体变量作为一个整体进行输入/出。例如:上面的 student1。只能具体到其中的具体变量才行。成员变量的引用方式:student1.num“.”是成员(分量)运算符,它在所有运算符中优先级最高。(2)如果成

8、员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取运算。例如:上面的取学生生日的年份:student1.birthday.year(3)对结构体变量的成员可以像其它变量一样进行各种运算,可以引用结构体变量成员的地址,也可以引用结构体变量的地址。如:student1.num+;因此,结构体变量的初始化就可以和普通变量的初始化一样。3、结构体数组、结构体数组例:有 10 个学生的信息需要处理,我们可以定义 10 个结构体类型的变量,但那样变量的管理比较烦,这时我们就可以通过结构体数组来管理,struct student stu10;

9、具体使用是数组与结构体的合并使用,比如:第一个学生的学号,stu0.num54、指向结构体类型数据的指针、指向结构体类型数据的指针一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该变量的值是结构体变量的起始地址。指向结构体变量的指针指向结构体变量的指针例:struct student stu1,*p;p= stu1.num 与(*p).num 相同,都代表学号,注:对指针(*p)两边的括号不能省。如省略则变成*p.num 因为“.”的优先级最高,所以相当于*(p.num)这是不对的。对其中成员变量的引用用以下三种形式:结构体变量.成员名(

10、*p).成员名p-成员名三者等价。注:p-n 得到 p 指向的结构体变量中的成员 n 的值。p-n+得到 p 指向的结构体变量中的成员 n 的值,用完该值后使它加 1+p-n 得到 p 指向的结构体变量中的成员 n 的值,使它加 1 后再使用。指向结构体数组的指针指向结构体数组的指针定义一个指向结构体数组的指针变量,这与前面定义指向数组或结构体变量的方法差不多。例:struct student stru110,*p;p=stru1;注意,这时指针是指向结构体数组,其类型还是结构体,其中 p 可以加 1,但这里加 1 后是指向数组的下一个元素,而不是在当前结构体中移动。例:struct stud

11、entint num;char name20;char sex;int age;struct student stu3=10101,”li”,M,18,10102,”zhang”,M,19,10104,”wang”,F,20;main()struct student*p;printf(“No.name sex agen”);for(p=stu;pnum,p-.name,p-sex,p-age);6打印结果:No.Name sex age10101 li M 1810102 zhang M 1910104 wang F 205、用指针处理链表、用指针处理链表(1)链表概述)链表概述链表是一种常见

12、的重要的数据结构。它是动态地进行存储分配的一种结构。链表有一个“头指针”变量,它存放一个地址。该地址指向链表第一个元素。链表中每一个元素称为“结点” ,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。例:定义一个存放学生学号及成绩的结构体结点,并建立含有三个学生的简单链表。struct studentint num;float score;struct student*nex;main()struct student a,b,c,*head,*p;a.num=9901;a.score=89.4;b.num=9903;b.score=79;c.num=9902;c.sc

13、ore=80;head=a.next=b.next=c.next=NULL;p=head;doprintf(“%d%5.1fn”,p-num,p-score);p=p-next;while(p!=NULL);(2)处理动态链表所需的函数)处理动态链表所需的函数链表结构是动态地分配存储的,即在需要时才开辟一个结点的存储单元,如何开辟呢?我们可以通过 C 语言提供的有关函数。malloc 函数其函数原型为:void*malloc(unsigned int size);作用:是在内存的动态存储区中分配一个长度为 size 的连续空间。此函数的返回值是一个指向分配域起始地址的指针。如果此函数未能成功地

14、执行,则返回空指针(NULL)calloc 函数7其函数原型为:void*calloc(unsigned n,unsigned size);作用:是在内存的动态区存储中分配 n 个长度为 size 的连续空间。函数返回一个指向分配域起始地址的指针;如果分配不成功,返回 NULL。free 函数其函数原型为:void free(*p);作用:是释放由 p 指向的内存区,使这部分内存区能被其他变量使用。(3)建立动态链表)建立动态链表所谓建立动态链表就是指:在程序执行过程中从无到有地建立一个链表,即一个一个地开辟结点和输入各结点数据,并建立前后相链的关系。例:建立一个有 n 名学生数据的单向链表s

15、truct studentlong num;float socre;struct student*next;int n;struct student*creat(void)struct student*p1,*p2,*head;n=0;p1=p2=(struct student*)malloc(struct student);scanf(“%ld,%f”,head=NULL;while(p1-num!=0)n=n+1;if(n=1)head=p1;else p2-next=p1;p2=p1;p1=(struct student*)malloc(struct student);scanf(“%l

16、d,%f”,p2-next=NULL;return(head);/返回头指针的地址8main()creat();注:(struct student*)它的作用是使 malloc 返回的指针转换为指向 struct student 类型数据的指针。其中*不能省略,否则变成转换成 struct student 类型了,而不是指针类型。(4)输出链表)输出链表void print(struct student*head)struct student*p;p=head;if(head!=NULL)doprintf(“%ld%5.1fn”,p-num,p-score);p=p-next;while(p!=NULL);(5)对链表的删除操作对链表的删除操作对已有的链表中

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号