常熟理工学院
《C语言程序设计》实验指导与报告书
______学年 第____ 学期
专 业: ___________________________________________ 学 号: ___________________________________________ 姓 名: ___________________________________________ 实验地点:___________________________________________ 指导教师:___________________________________________
计算机科学与工程学院
2014
1
实验10 指针程序设计(1)
10.1 实验目的
1.理解指针的概念,掌握指针变量的定义、初始化与使用方法。 2.掌握通过指针访问一维数组的编程方法。
3.掌握指针变量作为函数的形参时,参数传递的方法及特点。 4.掌握指针指向字符串的程序设计方法。
10.2 示例程序
【实验10.1】在以下程序中,主函数main()调用了3个函数swap1()、swap2()和swap3(),还定义了变量a和b,程序设计的目的是要求通过函数调用,交换main()中变量a和b的值。请分析在swap1()、swap2()和swap3()这3个函数中,哪个函数可以实现这样的功能。
程序代码:
# include
/* swap1的形参为变量x,y,函数的功能为交换变量的值 */ void swap1 (int x, int y) { int t;
t= x; x = y; y = t; }
/* swap2的形参为指针变量px,py,函数的功能为交换指针所指向的变量的值 */ void swap2 (int *px, int *py) { int t;
t = *px; *px = *py; *py = t; }
/* swap3的形参为指针变量px,py,函数的功能为交换指针所指向的变量 */ void swap3 (int *px, int *py) { int *pt;
pt =px; px = py; py = pt; }
int main (void) { int a = 1, b = 2;
int *pa = &a, *pb = &b; swap1 (a, b); a = 1;
2
/* 使用变量a,b调用函数swap1() */
printf (\
b = 2;
swap2(pa, pb); a = 1; b = 2;
swap3(pa, pb); return 0; }
/* 使用指针pa,pb调用swap3() */
printf (\
/* 使用指针pa,pb调用函数swap2() */
printf (\
说明:
1.运行该程序,分析运行结果。
2.函数swap1使用的是变量调用,也就是值调用,参数的传递是从实参变量到形参变量的单方向值的传递,形参值的改变不会影响到实参值的改变。调用结束变量a、b的值不会改变。
3.函数swap2使用的形参是指针变量,形实结合时,指针pa指向a,pb指向b,即指针pa与变量a指向同一单元,指针pb与变量b指向同一单元。当函数中交换了两个指针变量pa与pb所指向变量的值时,实参a与b的值同时改变。
4.函数swap3使用的形参也是指针变量,形实结合与swap2相同,所不同的是,函数中交换的是两个指针变量pa与pb的指向,即指针变量pa指向变量b,指针变量pb指向变量a,而实参变量a与b的值没有改变。
【实验10.2】本实验给出通过指针引用数组元素的各种方法。 方法一:通过下标引用数组元素
#include
printf(\for(i=0; i<10; i++)
scanf(\ for(i=0; i<10; i++)
printf(\printf(\return 0; }
/* 通过下标引用数组元素 */
方法二:通过数组名引用数组元素
#include
#include
srand(time(0)); for(i=0; i<10; i++)
*(a+i)=rand()?+10; for(i=0; i<10; i++)
printf(\
3
/* 随机生成2位的数字赋给数组元素 */
/* 改变随机数发生器的种子 */
printf(\
/* 引入头文件 */
printf(\return 0; }
方法三:通过指针代替数组名引用数组元素
#include
p=a;
for(i=0; i<10; i++)
p[i]=i; for(i=0; i<10; i++)
printf(\printf(\return 0; }
/* 变量i的值赋给数组元素 */
方法四:通过指针变量引用数组元素
#include
p=a;
for(i=0; i<10; i++)
*(p+i)=i; for(i=0; i<10; i++)
printf(\printf(\return 0; }
说明:
1.以上4个例子说明,使用指针指向数组以后,可以灵活、方便地对数组元素进行处理。事实上系统就是将数组转换为指针进行处理的。
2.如果有一个数组a,则a[i]和*(a+i)无条件等价;若有指针p指向a,则p[i]和*(p+i)也是无条件等价的,并且都可以对数组a的元素进行处理。要熟记访问数组元素的几种等价形式。
10.3 阅读程序
【实验10.3】以下程序通过指针变量p指向数组a的不同位置时,输出当前指针所指的元素。要求在注释中写出输出结果及含义。
程序代码:
#include
{ int i, a[5]={10,11,12,13,14},*p=a;
p++;
printf(\ /* */
4
p=a;
printf(\ /* */ p=a;
printf(\ /* */ p=a;
printf(\ /* */ p=a+2;
printf(\ /* */ p=&a[2];
printf(\ /* */ p=a;
printf(\ /* */ return 0; }
10.4 完善程序
【实验10.4】下面程序的功能是:调用merge函数,实现将指针s所指的字符串的反序和正序连接后形成一个新的字符串并存放在原处。如字符串为“1234”,执行函数后,字符串为“12344321”。请完善程序。
程序代码:
#include
________; gets(str); ________; puts(str); return 0; }
void merge(char *s) { char *p,*q,n;
n= ________;
*q=*p; *q='\\0'; }
/* n为指针s指向的串的长度 */ /* 反序存放 */
for(p=s+n-1,q=s+n;p>=s;p--,q++)
/* 调用函数 */
printf(\
/* 声明要调用的函数 */
printf(\
说明:
1.函数的形参为字符指针,调用时指针s指向字符串首地址。
2.函数中定义了指针p和q,循环开始时指针p指向串的最后一个字符,指针q指向最后一个字符后的地址,每循环一次,反序取出串的字符并依次存放到新的位置,直到处理
5