1、课程:C 语言程序设计 学号: 姓名: 班级:1实验 8-1 指针基本概念【知识点回顾】1. 指针变量1) 声明指针变量,如 int x, * p;中,p 为指针变量。2) 初始化指针变量,如 p=令 int 指针变量 p 指向 int 变量 x。3) 通过指针变量访问数据,如 scanf(“%d”,p);2. 指针运算符1) 间接访问运算符“*”2) 取地址运算符“int * pd; /声明指针变量pd= /初始化指针变量printf(“Direct access: data = %dn“, data); /变量的直接访问printf(“Indirect access: data = %dn
2、“,*pd); /变量的间接访问printf(“The address of data is %pn“, /变量的地址输出printf(“The address of data is %pn“,pd); /指针变量的输出return 0;【Q int * p=中,指针变量 p 是一个变量,系统要为它分配存储空间(通常为 4 个字节) ,该存储空间的起始地址即为指针变量的地址,即float *ptr_x=printf(“ptr_x=%fn“,*ptr_x );y=*ptr_x+2;printf(“y=%fn“,y);printf(“课程:C 语言程序设计 学号: 姓名: 班级:3printf(“
3、ptr_x=%pn“,ptr_x);2. 下列函数假设用来计算数组 a 中的元素和以及平均值,且数组 a 长度为 n。avg 和sum 指向函数需要修改的变量。函数含有几个错误,请找出这些错误并且改正。void avg_sum(float a, int n, float *avg, float *sum)int i;sum=0.0;for(i=0; ivoid avg_sum(float a, int n, float *avg, float *sum);int main()float a=1,3,5,7,9,avg,sum;avg_sum(a,5,printf(“avg=%.1fnsum=%
4、.1fn“,avg,sum);void avg_sum(float a, int n, float *avg, float *sum)int i;*sum=0.0;for(i=0; ivoid swap(int *p , int *q);int main()课程:C 语言程序设计 学号: 姓名: 班级:4int x,y;scanf(“%d,%d“,printf(“x=%d ,y=%dn“,x,y);swap(printf(“x=%d ,y=%dn“,x,y);void swap(int *p , int *q)int temp;temp=*p;*p=*q;*q=temp;4. 编写函数 voi
5、d findLargest(int a, int n, int *largest);当传递长度为 n 的数组 a 时,函数将找到数组的最大值元素,并用 largest 指针变量指向它。提示:调用该函数进行测试时,可使用 findLargest(a,10,类似的形式。#include void findLargest(int a, int n, int *largest);int main()int a=5,8,7,24,10,6,78,2,1,45,max=a0;findLargest(a,10,printf(“max=%dn“,max);课程:C 语言程序设计 学号: 姓名: 班级:5voi
6、d findLargest(int a, int n, int *largest)int i;for(i=1;i*largest )*largest=ai;【课后练习】1. 选择题:1) 变量的指针,其含义是指该变量的 B 。A. 值 B. 地址 C. 名 D. 一个标志2) 若需要建立如图所示的存储结构,且已有声明 float *p, m=3.14;则正确的赋值语句是 B 。A. p=m; B. p= C. *p=m; D. *p=3) 有如下语句int a=10, b=20, *p1, *p2;p1= p2= 如图 1 所示;若要实现图 2 所示的存储结构,可选用的赋值语句是 B 。A.
7、*p1=*p2 B. p1=p2; C. p1=*p2; D. *p1=p2;4) 若有语句 int *point, a=4; 和 point= 下面均代表地址的一组选项是 D 。A. a, point, *p1=a;A. a+0 B. p1+5 C. *p1 D. 且 0=i5, 则对 a 数组元素的非法引用是 D 。A. ai B. *(a+i) C. *(p+i) D. *(A. x3 B. p1=x+3, *p1+;C. p1=x+2, *(p1+); D. p1= x+2, *+p1;8) 若有声明:int * p, m=5, n; 以下正确的程序段是 D 。A. p= scanf(
8、“%d”, B. p= scanf(“%d”, *p);C. scanf(“%d”, *p=n;D. p= *p=m;9) 若有声明:int * p1, *p2, m=5, n;以下均是正确赋值语句的选项是 C 。A. p1= p2=B. p1= p2= *p1=*p2;C. p1= p2=p1;D. p1= *p2=*p1;10) 有四对对指针变量进行操作的语句,以下判断正确的选项是 D 。(1)int *p, *q; q=p;int a, *p, *q; p=q=(2)int a, *p,*q; q= p=*q;int a=20, *p; *p=a;(3)int a=0,b=0, *p;
9、p= b=*p;int a=20,*p,*q= *p=*q;(4)int a=20, *p, *q= a=q;int p, *q; q=A. 正确:(1 ) ; 不正确:(2) (3) (4) 。B. 正确:( 1) (4 ) ; 不正确:(2) (3) 。C. 正确:(3 ) ; 不正确:(1) (2 ) (4) 。D. 以上结论都不正确。11) 如下代码调用 scanf 语句有错,其错误原因是 B 。main()int *p, *q, a,b;p=printf(“input a: ”);scanf(“%d”, *p);A. *p 表示的是指针变量 p 的地址。课程:C 语言程序设计 学号:
10、 姓名: 班级:7B. *p 表示的是变量 a 的值,而不是变量 a 的地址。C. *p 表示的是指针变量 p 的值。D. *p 只能用来声明 p 是一个指针变量。12) 以下选项中,对指针变量 p 的正确操作是 B 。A. int a5, *p; p=B. int a5, *p; p=a;C. int a5; int *p=a=1000;D. int a5; int *p1, *p2=a; *p1=*p2;2. 下面程序的运行结果是 a=11 p=11 。a=03. 下面程序的运行结果是 b=6 。4. 下面程序的运行结果是 k=0 k=1 k=3 k=6 。课程:C 语言程序设计 学号: 姓名: 班级:85. 下面程序的运行结果是 n1=1 n2=6 。