实验练习七 指针
- 格式:doc
- 大小:70.50 KB
- 文档页数:8
实验练习七 用指针编程 实验目的 1、 掌握指针的基本用法,理解指针的本质。 2、 掌握函数、指针、数组的关系。
实验原理 int a=5; int *p;//定义了一个指向整型变量的指针变量p,p里面存放的是某整型变量的地址。 p=&a;//将p指向整型变量a,即p里面存放的是整型变量a的地址。 *p//通过指针变量p访问它指向的整型变量的值,等价于a,值为5. 1004(&a) 5 float b=4.5; p=&b;//错误,类型不匹配。 char *x;//定义了一个指向字符变量的指针变量x. float *y;//定义了一个指向单精度变量的指针变量y.
实验内容 1、指针的基本用法 (1)下面的程序用指针实现。要求用户输入2个整数,系统交换2个变量的值并进行输出。比如输入2 3,输出3 2。请理解程序,并调试运行。 #include void swap(int * ,int *); int main() { int x,y; printf("输入2个整数,用空格分开\n"); scanf("%d %d",&x,&y);
p:860 a:1004 swap(&x,&y); printf("%d %d",x,y); return 0; } void swap(int *a,int *b) { int t; t=*a; *a=*b; *b=t; } (2)关于指针运算符和++的运算。读下面的程序。 #include int main() { int a[5]={5,6,7,8,9}; int i,y,*p; p=a; printf("p的初始值是%u,p指向的整数单元的值是%d\n",p,*p); ; printf("现在y=%d\n",y); printf("现在p的值是%u,p指向的整数单元的值是%d\n",p,*p); printf("现在数组a的各个元素值分别是:"); for(i=0;i<5;i++) printf("%d\t",a[i]); return 0; } 在横线上分别填上如下的四条语句,分别有什么变化? y=*p++ y=*++p y=(*p)++ y=--*p++
2、指针与数组的关系 (1)阅读并运行下面的程序,理解指针和数组的本质。 #include main() { char *p,*s="chinaUSA"; p=s; puts(p); p++; puts(p); putchar(p[1]); } 在上面的程序中,编译器遇到p[1],将其翻译为*(p+1)。根本不管p是不是数组名。 (2) 用一个函数实现两个字符串的比较,即自己写一个strcmp函数,函数原型为: int strcmp (char * p1, char * p2); 设p1指向字符串s1,p2指向字符串s2,要求当s1=s2时,函数返回值为 0, 如果sl≠s2,则返回它们二者第一个不相同字符的ASCII码差值(如“BOY”与“BAD”的第二个字母不相同,“O”与“A”之差为79—65=14);如果sl>s2,则输出正值;如果sl负值。 两个字符串s1、s2由main函数输入,strcmp函数的返回值也由main函数输出。 #include int strcmp (char * p1, char * p2)//p1,p2分别指向两个字符串的首字符 { while(*p1!='\0'||*p2!='\0'){ //到任意一个字符串结束符时结束 if(*p1==*p2){ //对指向的字符进行比较,相等,继续比较下一个字符 p1++; //指向下一个字符 p2++; } else return (*p1-*p2); //不相等,返回两字符的差值 } if(*p1=='\0' && *p2!='\0') //p2指向的串长,返回负数 return -1; else if(*p1!='\0' && *p2=='\0') //p1指向的串长,返回正数 return 1; else if(*p1=='\0' && *p2=='\0') //p1,p2指向的串长度相同,返回0 return 0; } void main() { char a[80]; char b[80]; int rev; scanf("%s %s",a,b); rev=strcmp(a,b); if(rev==0){ printf("equal"); } else if(rev<0) printf("is lower"); else printf("is upper");
} (3)关于二维数组中的指针。假设:数组a[3][4]放到相对地址2000处。 注意:行指针变成列(元素)指针,要加*号。 如:a+1是第1行(行数从0开始)的行指针,那么该行的首元素的指针是*(a+1)+0,该行的次元素的指针是*(a+1)+1,以此类推。
请大家自行编程验证。可参考实验二中的“二维数组的存储”部分。 3、指向函数的指针 下面的程序实现了两个整数的加、减、乘、除等4个运算,分别用add()、sub()、mtp()、div()这4个函数来实现。程序中定义了一个指针数组,每个元素都是指向函数的指针。上述的4个函数名(编译后是函数地址)被存放到该数组中。仔细阅读并执行下面的程序,分析执行过程,理解指向函数的指针。 【说明】 不同的编译器对语法检查的苛刻程度不一。 比如int add(int,int);声明语句,有的编译器不要求声明形参类型
a[0] a[1] a[2]
2000 2008 2016
2000 2002
2008 2010
2016 2018
a[0][0] a[0][1]
a[1][0] a[1][1]
a[2][0] a[2][1]
a[0][2] a[0][3]
a[1][2] a[1][3]
a[2][2] a[2][3]
a a+1 a+2 比如int (*function[4])();和 int execute(int x,int y,int (*fun)()) 有的编译器要求在括号中添加int,int等。
#include int main() { int add(int,int); int sub(int,int); int mtp(int,int); int div(int,int); int execute(int x,int y,int (*fun)(int,int)); int (*function[4])(int,int);/*定义了一个数组,每个元素都是指向函数的指针*/ int a=10,b=5,i; function[0]=add;/*将4个函数名(函数地址)存放到数组中*/ function[1]=sub; function[2]=mtp; function[3]=div; for(i=0;i<4;i++) printf("fun no.%d->%d\n",i,execute(a,b,function[i]));/*指向函数的指针作实参*/ return 0; } int execute(int x,int y,int (*fun)(int,int))/*指向函数的指针作形参*/ { return (*fun)(x,y); } int add(int x, int y) { return(x+y); } int sub(int x,int y) { return(x-y); } int mtp(int x,int y) { return(x*y); } int div(int x,int y) { return(x/y); } 4、指针与位运算的结合 函数实现计算字符串ACSII码的二进制形态0出现的次数之和。 将一个字符串中指定的大写字母前的所有字母截取出来,计算被截取出来的所有字母的 ASCII码的二进制形态0出现的次数之和,将0出现的次数之和写入指定的地址。 比如:字符串”WEIWENDATA” 在字符’N’之前的的字符串为”WEIWE”;之后将字符串” WEIWE”中每个字符的ASCII值的二进制码中0出现的个数统计出来,再计算其和,其中可用位运算。
函数原型 int count_student(char *str, char ch, int *count); 参数说明 str 为被操作的字符串首地址,字符串的元素全为大写字母; ch 为指定的大写字母,此大写字母在str中只会出现一次; count 为被写入的地址。
返回值 0 操作成功,正常返回; 1 str为空,即str==NULL,此时coun写入值为-1。
参考代码: //pptest.c /****************************************************************
* Function: Intercept the string before a character,count string * binary form 0 appear times * Time: 2013-04-21 * **************************************************************/
#include #include #include #include #include
// student's function int count_student(char *str, char ch, int *count);
// student's function int count_standard(char *str, char ch, int *count) { int i; int j; int sum; char temp;
i = 0; j = 0;