【EduCoder实训作业】复习-指针基本概念

第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;
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值