对C语言指针的认识的认知实习报告.docx
- 文档编号:25606527
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:18
- 大小:23.70KB
对C语言指针的认识的认知实习报告.docx
《对C语言指针的认识的认知实习报告.docx》由会员分享,可在线阅读,更多相关《对C语言指针的认识的认知实习报告.docx(18页珍藏版)》请在冰豆网上搜索。
对C语言指针的认识的认知实习报告
认知实习报告
题目:
对C语言指针的认识
学生姓名:
学号:
班级:
所属学院:
指导教师:
2013年7月
对C语言指针的认识
学生姓名:
学号:
班级:
指导教师:
完成日期:
1绪论......................................................1
1.1实习背景及目的........................................1
1.2实习研究方法..........................................1
2实习要求..................................................2
3实习地点..................................................2
4实习内容..................................................2
4.1指针、地址及指针变量..................................2
4.2指针与数组............................................4
4.2.1指针与数组的关系.................................4
4.2.2指针与数组元素...................................5
4.2.3通过指针引用数组.................................8
4.2.4指针数组与多重指针...............................10
4.3指针与函数............................................12
4.3.1指向函数的指针...................................12
4.3.2用函数指针变量调用函数...........................13
4.3.3用指向函数的指针作函数参数.......................13
4.3.4函数返回指针.....................................14
4.4指针与字符串..........................................15
5实习感想..................................................17
6参考文献..................................................17
7附录......................................................18
1绪论
1.1实习背景及目的
认识实习是教学计划重要部分,它是培养学生的实践等解决实际问题的第二课堂,它是专业知识培养的摇篮,也是对生产流水线的直接认识与认知。
实习中应该深入实际,认真观察,获取直接经验知识,巩固所学基本理论,保质保量的完成指导老师所布置任务。
学习技术人员的勤劳刻苦的优秀品质和敬业奉献的良好作风,培养我们的实践能力和创新能力,开拓我们的视野,培养生产实际中研究、观察、分析、解决问题的能力。
认识实习是我们大学生的一门必修课,通过认知实习,我们要对信息科学与信计专业建立感性认识,并进一步了解本专业的学习实践环节。
通过接触实际过程。
一方面,达到对所学专业的性质、内容及其在技术领域中的地位有一定的认识,为了解和巩固专业思想创造条件,在实践中了解专业、熟悉专业、热爱专业。
另一方面,巩固和加深理解在课堂所学的理论知识,让自己的理论知识更加扎实,专业技能更加过硬,更加善于理论联系实际。
再有,通过使用计算机进行编程处理,为进一步学习技术基础和专业课程奠定基础。
另外,指针是C语言中广泛使用的一种数据类型,运用指针编程是C语言最主要的风格之一,利用指针变量可以很方便地使用数组与字符串并能直接查询到计算机的内存地址,同时使用指针也可以构造各种数据结构、网络消息等。
能否正确理解和使用指针,是关乎是否掌握C语言的一个重要标志。
1.2实习研究方法
运用计算机进行操作
2实习要求
1、不得迟到、早退、旷实习等,如因特殊原因不能按时到达或不能去实习应向班长或带队老师请假;
2、实习期间仔细观察,认真听老师或师傅的讲解,遇到不懂得地方可以提出来,随时做笔记;
3、实习期间要严肃认真,禁止喧哗打闹。
3实习地点
1、数计学院实验中心
4实习内容
4.1指针、地址及指针变量
1、指针:
能够标识内存单元的地址
2、简单的讲:
指针就像桌面的快捷方式一样。
C语言中通常使用指针变量来实现指针的应用。
[1]
3、指针变量:
专门用来存放另一变量的地址的变量,指针变量就是地址变量用来存放地址,指针变量的值是地址。
4、指针是一个地址,指针变量是存放地址的变量。
5、指针的引用:
如何对指针变量赋值以及如何使用指针变量。
就是要让该指针指向某内存单元,可以通过符号&来获取某个变量的地址。
指针引用有三种情况:
(1)给指针变量赋值
(2)引用指针变量指向的变量
(3)引用指针变量的值
例:
输入a、b两数,按先大后小顺序输出
#include
Intmain()
{
Int*p1,*p2,*p,a,b;
printf(“pleaseentertwointegernumbers:
”);
scanf(“%d,%d,&a,&b”);
p1=a;
p2=b;
if(a
{p=p1;p1=p2;p2=p;}
printf(“a=%d,b=%d\n”,a,b);
printf(“max=%d,min=%d\n”,*p1,*p2);
return0;
}
运行结果:
pleaseentertwointegernumber:
5,9
a=5,b=9
max=9,min=5
6、指针与地址:
地址是对计算机内存进行的连续编号,指针是地址的操作者与使用者。
地址是一个表征计算机系统内存单元的常量,指针是可以等于任何地址值的变量。
7、void指针:
空指针(NULL)是不指向任何有效地址的指针
8、指针变量的定义:
类型名*指针变量名如:
int*pointer_1,*pointer_2;
4.2指针与数组
4.2.1指针与数组的关系
1、指针变量用于存储某内存单元的地址,而数组名也代表某内存变量的地址。
数组名不代表整个数组,只代表数组首元素的地址。
当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。
2、例:
#include
main()
{
int*a=NULL;
intb[5]={0,1,2,3,4};
a=b;
printf(“a=%x,b=%x\n”,a,b);
}
结果:
a=12ff68,b=12ff68
结果表明:
b的值为内存地址0x0012ff68
C语言中数组名是作为地址常量来处理的,其值为该数组的首地址
4.2.2指针与数组元素
1、数组元素的指针就是数组元素的地址
可以用一个指针变量指向一个数组元素,如:
inta[10]={1,3,5,7,9,11,13,15,17,19};
int*p;
p=&a[0];
其中p=&a[0];与p=a;等价(因数组名代表数组中首元素的地址)
2、引用数组元素可以用下标法(如a[3]),也可以用指针法,即通过指向数组元素的指针找到所需的元素
3、在指针指向数组元素时,可以对指针进行一下运算:
加一个整数(用+或+=),如p+1;
减一个整数(用—或—=),如p—1;
自加运算,如p++,++p;
自减运算,如p——,——p;
两个指针相减,如p1—p2(只有p1与p2指向同一数组中的元素时才有意义)
说明:
(1)若指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p—1指向同一数组中的上一个元素。
(2)如果p的初值为&a[0],则p+i和a+i就是数组元素a[i]的地址
(3)*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]
(4)如果指针变量p1与p2都指向同一数组,如执行p2—p1,结果是p2—p1的值除以数组元素的长度。
4、引用一个数组元素的方法:
(1)下标法,如a[i]形式
(2)指针法,如*(a+i)或*(p+i)其中a是数组名,p是指向数组元素的指针变量,其初值p=a
例1:
inta[10],*p,
p=&a[9];
p是一个指向数组元素的指针,它指向一维数组a的第9个元素a[9]
例2:
一个整型数组a,有10个元素,要求输出数组中的全部元素(用指针法)
#include
intmain()
{
inta[10];
int*p,i;
printf(“pleaseenter10integernumbers:
”);
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
for(p=a;p<(a+10);p++)
printf(“%d”,*p);
printf(“\n”);
return0;
}
运行结果:
pleaseenter10integernumbers:
0123456789
0123456789
例3:
一个指向二维数组元素的指针的例子。
分析下列程序输出结果。
#include
main()
intm[2][3]={(1,3,5),{7,9,11};
main()
{
int*p;
for(p-m[0];p { if((p一m[0])%3==0) printf("\n"); printf("%4d",*p); } printf("\n"); } 执行该程序输出结果如下: 135 7911 说明: 该程序中定义了一个指针P,它指向数组m的首元素,因为m[0]表示该数组第。 行首列元素的地址,与&[0][0]等价。 因此,P是一个指向二维数组m的首元素的指针。 请将P指针向数组m的尾元素,输出如下结果: 11 9 7 5 3 1 4.2.3通过指针引用数组 1、引用一维数组 一维数组是一个线形表,它被存放在一片连续的内存单元中。 C语言对数组的访问是通过数组名(数组的起始地址)加上相对于起始地址的相对量(由下标变量给出),得到要访问的数组元素的单元地址,然后再对计算出的单元地址的内容进行访问。 通常把数据类型所占单元的字节个数称为扩大因子。 实际上编译系统将数组元素的形式a[i]转换成*(a+i),然后才进行运算。 对于一般数组元素的形式: <数组名>[<下标表达式>],编译程序将其转换成: *(<数组名>+<下标表达式>),其中下标表达式为: 下标表达式*扩大因子。 整个式子计算结果是一个内存地址,最后的结果为: *<地址>=<地址所对应单元的地址的内容>。 由此可见,C语言对数组的处理,实际上是转换成指针地址的运算。 数组与指针暗中结合在一起。 因此,任何能由下标完成的操作,都可以用指针来实现,一个不带下标的数组名就是一个指向该数组的指针。 例1: int(*pa)[5]; pa是一个指向一维数组的指针,它所指向的一维数组是由5个int型元素组成的。 如果该指针加1,则将指向下面的5个元素,*pa指针的增值是以5个元素的一维数组长度为单位的。 实际上,指向一维数组的指针,是指向二维数组的某一列的首元素地址。 例如: int(*pa)[5]; inta[3][5]; pa=a+1; 这表明pa是一个指向一维数组的指针,它指向二维数组a的第一行首列元素的地址。 pa加1将指向第二行首列元素的地址,pa-1将指向第0行首列元素地址。 2、引用多维数组 *(a[i]+j)等价于*(*(a+i)+j)等价于a[i][j][2] 务必记住*(a+i)等价于a[i] 表示形式 含义 a 二维数组名,指向一维数组a[0] a[0],*(a+o),*a 0行0列元素地址 a+1,&a[1] 1行首地址 a[1],*(a+1) 1行0列元素a[1][0]的地址 a[1]+2,*(a+1)+2,&a[1][2] 1行2列元素a[1][2]的地址 *(a[1]+2),*(*(a+1)+2),a[1][2] 1行2列元素a[1][2]的值 例1: 一个指向二维数组指针的例子。 分析该程序的输出结果,说明指向一维数组的指针是怎祥赋值和使用的。 #include main() { inta[3][5]={1,2,3,4,5},{6,7,8,9,10},{ll,12,13,14,15}; int(*p)[5]; p=a+1; printf("%d,%d,%d\n",p[0][0],*(*(p+1)+1),*(p[-1]+3)); } 执行该程序输出结果如下: 6,12 说明;程序中p是一个指向一维数组的指针,它所指向的一维数组有5个int型元素。 即p要指向一个包含有5个元素的一维数组。 p的值是该一维数组的首元素地址。 用a十1或&a[1]值赋给p,则使p指向a数组的第一行首列地值。 不能用某行某列的地值给p赋值,p[0][0]等价于**p,即a[1][0]元素的值。 *(*(p+1)+1)等价于p[1][1]等价于*(*(a+2)+1),即a[2}[1]元素的值。 而*(p[-1]+3)等价于*(*(p-1)+3)等价于*(*(a+0)+3),即a[0][3]元素的值。 因此,输出上述结果。 实际上,指向一维数组的指针是一个二级指针,它所指向的是一个二维数组,给指向一维数组的指针所赋的值是二维数组的某行的行地址。 二维数组a[3][5]的行地址表示为a十i,i为0,1,2.一个指向一维数组的指针(*p)[5]可以用a+i(i=0,1,2)来进行赋值。 4.2.4指针数组与多重指针 指针数组是指数组元素为指针类型数据的数组。 数组元素可以为int型,float型和double型,称为数值数组;数组元素为char型的称为字符数组;数组元素为指针的称为指针数组,最常用的是一维一级指针数组,即该数组是一维的,它的每个元素是一个一级指针,或是一维数组,因此一维一级指针数组实际上是一个二维数组。 此外,还有一维二级指针数组和二维一级指针数组,它们实际上是一个三维数组。 其他的指针数组使用甚少。 指针数组在定义形式上与指向数组的指针很相似,使用中应注意区别。 指针数组定义格式如下: 类型说明符*数组名[数组长度]; 这是一维一级指针数组的定义格式。 而指向一维数组的指针定义格式如下: 类型说明符(*数组名)[数组长度]; 比较可知,二者只差一个圆括号,这个圆括号的作用是改变了优先级。 没有圆括号的是数组名与[]结合,则是数组。 有了圆括号的是*与数组名结合,则是指针,后面的说明是指向一维数组的指针,例如: int*p[5]; int(*g)[5]; 其中,p是一维一级指针数组名,g是指向一维数组的指针名。 一维二级指针数组和二维一级指针数组表示如下: int**al[5]; *a2[3][5]; 其中,al是一维二级指针数组名,a2是二维一级指针数组名。 指针数组的赋初值和赋值办法与数组一样,只是所赋予的值是地址值。 例1: 一个指针数组的例子。 分析下列程序的输出结果,说明指针数组的赋值方法。 { inta[6]={1,2,3,4,5.6}. main() int*p[3]; for(i=0i<3,i++) p[i]=&a[i*2]; prinif('%d,d\n"",p[1][1],,*(p[2]+1)); } 执行该程序输出如下结果: 4,6 说明: 该程序中p是一个一维一级指针数组名,它有3个元素,即每个元常是指向int型的指针。 通过for循环给p赋值,分别使p[0]值为&a[0],p[1]值为&a[2],p〔2」值为&a[4].指针数组比较适合于对若干字符串的处理。 字符串本身是一个一维字符数组,如将若干个字符串放到一个二维字符数组中,则每一行的元素个数要求相同,实际上各字符串长度不等,只好按字符串中最长的作为每行的元素个数。 这样将会造成内存空间的浪费。 如果采用指针数组便可克服存储空间的浪费问题。 因为指针数组中各个指针元素可以指向不同长度的字符串。 因此,实际编程中常用字符型的指针数组存放字符串。 4.3指针与函数 4.3.1指向函数的指针 1、定义: 在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址称为这个函数的指针 例: int(*p)(int,int); 定义p是一个指向函数的指针变量,它可以指向函数的类型为整型且有两个整型参数的函数。 p的类型用int(*)(int,int)表示。 4.3.2用函数指针变量调用函数 1、调用函数的方法: (1)通过函数名调用函数 (2)通过指针变量调用函数 2、定义和使用指向函数的指针变量 (1)定义形式: 类型名(*指针变量名)(函数参数表列) 注意: 1)定义指向函数的指针变量,不意味着这个指针变量可以指向任何函数,它只能指向在定义是指定的类型的函数。 如“int(*p)(int,int);”表示指针变量p只能指向函数返回值为整型且有两个整型参数的函数。 2)要用指针调用函数,必须先使指针变量指向该函数。 3)在给函数指针变量赋值时,只需给出函数名而不必给出参数。 4)用函数指针变量调用函数时只须将(*p)代替函数名即可,在(*p)之后的括号中根据需要写上实参。 5)对指向函数的指针变量不能进行算术运算。 6)用函数名调用函数,只能调用所指定的一个函数而通过指针变量调用函数比较灵活,可以根据不同情况先后调用不同的函数。 4.3.3用指向函数的指针作函数参数 1、指向函数的指针变量的一个重要用途就是把函数的地址作为参数传递到其他函数。 2、指针作函数参数主要分为两种类型: 一、函数形参二、函数实参 3、指针作函数形参定义: 类型名函数名(类型名1*指针名1,类型名2*指针名2,.....) 4.3.4函数返回指针 1、定义返回指针值的函数的一般形式: 类型名*函数名(参数表列) 例: float*search(float(*pointer)[4],intn) 2、例: 主函数中输入数字的星期数,调用子函数char*week_day(intindex)输出英语的星期名称,编写指针函数实现。 #include #defineN20 Staticchardate[8][N]= {“Sunday”,”Monday”,”Wednesday”,”Thursday”,”Friday”,”Saturday”,”Illegalinputindex” }; char*week_day(intindex) { return(0<=index&&index<=7)? Date[index]: data[7]; } main() { intindex=0; printf(“请输入日期数: \n”); scanf(“%d”,&index); printf(“输入值=%d\n”,index); printf(“日期名称为: %s\n”,week_day(index)); } 运行输入4 结果: 输入值=4 日期名称为: Thursday 4.4指针与字符串 1、字符串的引用方式有两种: (1)通过数组名和下标引用字符串一个字符 (2)通过数组名和格式声明“%s”输出该字符串 2、字符指针作函数参数 作函数参数有三种方法: (1)用字符数组名作为函数参数 (2)用字符型指针变量作实参 (3)用字符指针变量作形参与实参 例: 用函数调用实现字符串的复制 #include intmain() { voidcopy_string(char*from,char*to); char*a=”Iamateacher.”; charb[]=”Youareastudent.”; char*p=b; printf(“stringa=%s\nstringb=%s\n”,a,b); printf(“\ncopystringatostringb: \n”); copy_string(a,p); printf(“stringa=%s\nstringb=%s\n”,a,b); return0; } voidcopy_string(char*from,char*to); { for(;*from! =’\0’;from++,to++) *to=*from; *to=’\0’; } 运行结果: stringa=Iamateacher. stringb=Youareastudent. copystringatostringb: stringa=Iamateacher. stringb=Iamateacher. 3、字符指针变量与字符数组 (1)字符数组由若干个元素组成,每一个元素中放一个字符,而字符指针变量中存放的是地址。 (2)可以对字符指针变量赋值,但不能对数组名赋值。 (3)数组可以在定义时对个元素赋值,但不能用赋值语句对字符数组中全部元素整体赋值。 (4)编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元。 (5)指针变量的值是可以改变的而数组名代表一个固定的值,不能改变。 (6)字符数组中个元素的值是可以改变的,但字符指针变量指向的字符串常量中的内容是不可以被取代的。 (7)若指针变量没有指向数组,则不能用下标法与指针法引用数组元素;若字符指针变量p指向字符串常量就可以用下标法与指针法引用所指的字符串中的字符。 (8)用指针变量指向一个格式字符串,可以用它来代替printf函数中的格式字符串。 但使用字符数组时,只能用在定义数组时初始化或逐个对元素赋值的方法,而不能用赋值语句对数组整体赋值。 5实习感想 五天的认知实习很快就结束了,我觉得这种形式的认知实习非常的有意思,因为这比坐在课堂里听讲来得更为实际、直观。 通过实际操作,我了解了C语言中指针变量问题,对指针的应用、指针与数组的结合和怎样运用指针处理问题都有了一定认识,并对VC++6.0该软件有了更深的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 指针 认识 认知 实习 报告