第1关:通过指针变量间接访问变量
任务描述
本关任务:编写程序通过指针变量间接访问整型变量。
相关知识
为了完成本关任务,你需要掌握:
1.如何定义指针变量;
2.掌握两个与指针变量有关的运算符。
如何定义指针变量
指针变量指的是定义存放变量地址的变量,定义指针变量如下:
int *p1; //p1是指向int型变量的指针变量
float p2; //p2是指向float型变量的指针变量
double p3; //p3是指向double型变量的指针变量
char p4; //p4是指向char型变量的指针变量
是一个特殊符号,表明一个变量是指针变量,定义指针变量时必须带,而给指针变量赋值时,就没必要再带上,后边可以像使用普通变量一样来使用指针变量。也就是说,定义指针变量时必须带,给指针变量赋值时不能带。
掌握两个与指针变量有关的运算符
取地址运算符“&”
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。在 C 语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。C 语言中提供了地址运算符&来表示变量的地址。
其一般形式为:& 变量名, 如&a变示变量a的地址,&b表示变量b的地址。
取内容运算符“”
取内容运算符“”,用来表示指针变量所指向的变量内容(值),在“*”运算符之后跟的变量必须是指针变量。
示例如下:
int p,a;
p = &a; //给指针变量p赋值时不能带,&a表示变量a的内存地址
scanf("%d",p); // 通过指针变量p从键盘输入数据赋给变量a,p和&a是等价的
printf("%d\n",*p); // 通过指针变量p输出变量a的值,*p和a是等价的
如何利用指针变量访问不同的变量
利用指针变量,通过改变它的指向,可以实现以相同的形式输入输出不同的变量值。
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,输入输出两个变量的值。
测试说明
平台会对你编写的代码进行测试:
测试输入:
100
200
预期输出:
100
200
#include <stdio.h>
int main()
{
int x,y;
int *p; //定义指针变量p
p=&x; //使指针变量p指向一个变量x
/***** 请在以下填写通过p输入输出x值代码 *****/
/********** Begin **********/
scanf("%d",p);
printf("%d\n",*p);
/********** End **********/
p=&y; //使指针变量p指向另一个变量y
/***** 请在以下填写通过p输入输出y值代码 *****/
/********** Begin **********/
scanf("%d",p);
printf("%d",*p);
/********** End **********/
return 0;
}
第2关:交换两个指针变量的值
任务描述
本关任务:编写程序交换两个指针变量的值。
相关知识
为了完成本关任务,你需要掌握指针数据类型。
基本数据类型和指针数据类型的区别
指针是一种特殊的,同时又是具有重要作用的数据类型。其值用来表示某个变量在内存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此不能混为一谈。
int a = 100; // 100为int型常量,a为int型变量
double b = 3.14; // 3.14为double型常量,b为double型变量
int *pa = &a; // &a为指针类型常量,&a值由系统分配得到,pa为指针变量
要注意的是,指针变量虽然存的是地址,但是不能用整型直接赋值的,比如:
int ptr;
ptr = 10; //错误,不能直接用整型赋值
ptr = (int)10; //可以通过强制类型转换赋值,但除非很了解内存布局,否则这么做一般会出现程序异常
但是有一个特例,那就是赋值 0 的时候,这个时候表达的含义是空指针,比如:
int ptr;
ptr = 0; //这个是可以的
注意:与其他变量一样,没有初始化或者赋值的指针变量存的值是随机的,如果此时直接使用运算符,则会因为访问了不属于程序的内存位置而发生异常。也就是所谓的访问越界。
指针变量的交换运算
指针变量保存的是地址,而地址本质上是一个整数,所以指针变量可以进行部分运算,例如加法、减法、比较等,还可以交换两个指针变量的值,指针变量可以像基本类型变量一样进行交换。
示例如下:
int a = 100,b = 200;
int *pa = &a, *pb = &b,*temp;
temp = pa; pa = pb; pb = temp;
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,交换两个指针变量的值。
测试说明
平台会对你编写的代码进行测试:
测试输入:
100 200
预期输出:
200 100
#include <stdio.h>
int main()
{
int a=100,b=200;
int *p1, *p2, *p;
p1=&a;
p2=&b;
scanf("%d%d",p1,p2);
/***** 交换p1、p2的值 *****/
/********** Begin **********/
p = p1;
p1 = p2;
p2 = p;
/********** End **********/
printf("%d %d\n",*p1,*p2);
return 0;
}
第3关:利用指针方法求数组的最大值和最小值
任务描述
本关任务:编写程序,利用指针方法求数组的最大值和最小值。
相关知识
擂台赛算法思想
求最大值的擂台赛算法思想:从数组中任意找一个数组元素作为擂主,默认是最大值,遍历数组,将每个数组元素依次和擂主比较,如果比擂主大就将这个数组元素的值赋给擂主,否则就离开,直至最后一个数组元素,即可得出擂主就是最大值。
为了完成本关任务,需要定义一个指针变量指向任意一个数组元素,擂主是指针变量指向的数组元素,遍历数组,将每个数组元素依次和指针变量指向的数组元素比较。如果大就将这个数组元素的地址赋给指针变量,否则指针变量的值不变,直至最后一个数组元素,即可得出指针变量指向的数组元素为最大。
求最小值的算法思想与求最大值的算法思想一致。
用指针变量指向最大值最小值
定义指针变量 max 保存最大值的地址,指针变量 min 保存最小值的地址。
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,从后台输入 3 个数,使用指针方法找到 3 个数中最大和最小的数并输出。
测试说明
平台会对你编写的代码进行测试:
测试输入:
4 91 51
预期输出:
min=4
max=91
测试输入:
151 91 1
预期输出:
min=1
max=151
#include<stdio.h>
#define M 3
main()
{
int a[M],i;
int *max,*min;
for(i=0 ;i<M; i++)
{
scanf("%d",&a[i]);
}
/***** 将指针变量max,min初始化 *****/
/********** Begin **********/
max = &a[0];
min = &a[0];
/********** End **********/
/***** 将每个数组元素依次与max,min指向的数组元素比较,使max,min分别指向的最大、最小的数组元素 *****/
/********** Begin **********/
for(int i=0;i<M;i++)
{
if(*max<a[i]) max = &a[i];
if(*min>a[i]) min = &a[i];
}
/********** End **********/
/***** 通过指针变量max,min输出最大值和最小值 *****/
/********** Begin **********/
printf("min=%d\nmax=%d",*min,*max);
/********** End **********/
return 0;
}