实验六 指针
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六指针
一、实验目的
1、掌握指针的概念,会定义和使用指针变量;
2、学会使用数组的指针和指向数组的指针变量;
3、学会使用字符串的指针和指向字符串的指针变量;
4、学会使用指向函数的指针变量;
5、了解指向指针的指针的概念及其使用方法。
二、实验指导
1.内容提要
①指针的定义:基类型* 指针变量名如int *p,*q ;定义了两个指向整型数据的指针p 和q。
②指针类型小结:
◆int *p[n] 为指针数组,其中有n 个指针均指向整数;
◆int (*p)[n] 为数组指针,p为指向含n个元素的一维数组的指针变量;
◆int *p() 为指针函数,p为返回一个指针的函数,该指针指向整型数据;
◆int (*p)() 为函数指针,该函数返回一个指向整型值的指针;
◆int **p 为二重指针,p是一个指针变量,而它又指向一个指向整型数据的指针变量。
③指针运算小结:
◆指针变量加减一个整数:如p+i (p为一个指针,下同) 表示p+c*i,其中c 为
p指向的数据类型所占的字节数;
◆指针变量赋值:
p=&a 将变量a 的地址赋给p;
p=array 将数组array的首地址赋给p;
p=&array[i] 将数组array的第i个元素的地址赋给p;
p=max max为已定义的函数,将max的入口地址赋给p;
p1=p2 p1、p2都是指针变量,将p2的值赋给p1;
◆指针变量可以定义为一个空值,即不指向任何变量,如:p=NULL(NULL为0);
◆两个指针变量相减:p2-p1,其中p1,p2是指向同一个数组的元素,则表示两个指
针之间的元素个数;
◆两个指针变量的比较:若两个指针变量指向同一个数组的元素,则可进行地址之
间的比较,否则无实际意义;
④带形参的main函数;
main函数可以带有形参,用来接收来自命令行的实参。这个命令行指的是调用此
main函数的命令(即运行命令)。
带形参的main函数的一般形式:
main(int argc, char *argv[])
{......}或
main(int argc, char * *argv)
{......}
其中:argc存放命令行中含命令名在内的参数个数,它总是大于或等于1。argv 是一个指向命令行字符串的指针数组。argv[0]指向命令行的第一个字符串(命令名),argv [1]指向命令行的第二个字符串,其它依次类推。
命令行的一般形式:
命令名参数1参数2...参数n
命令名和各参数之间用空格分隔。各参数都是字符串,字符串可以不带双引号,若字符串本身含有空格,则应用双引号括起
2.实验注意要点
①不要试图将一个整数赋给一个指针变量,如:p=2020是错误的,同样也不可将一个指针p的值(地址)赋给一个整型数据,如:i=p也是错误的;
②在*、++、――同时出现的表达式中,请注意用括号,否则常出现错误,如:*p++,所表达的意思就容易理解错误,而(*p)++就比较清楚;
③特别注意:不要定义一个指针后直接对其赋值,因为定义指针后,其指向的是一个不确定的地址,而对其进行赋值可能破坏系统的正常工作。如:int *temp;*temp=3;这种情况是绝不允许的;
④不能企图通过改变指针形参的值而使指针实参的值改变。即:指针变量作函数参数也要遵循函数中实参变量和形参变量之间的数据传递是单向的“值传递”方式。如:swap(int *p1,int *p2) {int *p; p=p1;p1=p2;p2=p;}
main() {……;if (a
作者的意思是想用swap函数实现两个数的从大到小的顺序排列,事实上是不行的。
⑤二维数组名(如a)是指向行的,因此a+1中的“1”代表一行中全部元素所占的字节数,而一维数组名(如a[0],a[1]是指向列元素的,a[0]+1中的“1”代表一个元素所占的字节数。
三、实验内容
1、以下程序完成功能为:输入3个数a,b,c,按大小顺序输出,请修改以下程序中的错误,得到正确的运行结果。
程序分析:利用指针方法。
程序源代码:
/*pointer*/
#include
main()
{
int n1,n2,n3;
int *pointer1,*pointer2,*pointer3;
printf("please input 3 number:n1,n2,n3:");
scanf("%d,%d,%d",&n1,&n2,&n3);
pointer1=&n1;
pointer2=&n2;
pointer3=&n3;
if(n1>n2) swap(pointer1,pointer2);
if(n1>n3) swap(pointer1,pointer3);
if(n2>n3) swap(pointer2,pointer3);
printf("the sorted numbers are:%d,%d,%d\n",n1,n2,n3);
}
//以下程序有错
swap(int p1,int p2)
{int p;
p=p1;p1=p2;p2=p;
}
2、程序填空并调试:
下面的程序可以实现从10个数中找出最大数和最小值的功能,请填空完成并上机调试。
# include
int max,min;
find(int *p, int n)
{ int *q;
max=min=*p;
for(q=_____①____; ____②___;q++)
if(__③____) max=*q;
else if (___④____) min=*q;
}
main ( )
{ int i,num[l0];
printf("Input 10 numbers:\n");
for(i=0;i scanf("%d",&num[i]); find(num, 10); printf("max=%d,min=%d\n”,max,min); } 3、编程,输入n(3 4、已有一个已排好序的数组a[5],数组元素值为{3,7,11,27,56},今输入一个数x,要求按原来排序的规律将它插入数组中 5、用数组编程求菲波那挈数列1,1,2,3,5,8,13,21,......的前n项并输出结果,n由用户输入,要求使用数组。(n值小于30)