指针
一、PTA实验作业
题目一、6-1 计算两数的和与差(10 分)
本题要求实现一个计算输入的两数的和与差的简单函数。
函数接口定义:
void sum_diff( float op1, float op2, float *psum, float *pdiff );
其中op1
和op2
是输入的两个实数,*psum
和*pdiff
是计算得出的和与差。
裁判测试程序样例:
#include <stdio.h>
void sum_diff( float op1, float op2, float *psum, float *pdiff );
int main()
{
float a, b, sum, diff;
scanf("%f %f", &a, &b);
sum_diff(a, b, &sum, &diff);
printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
4 6
输出样例:
The sum is 10.00
The diff is -2.00
1、本题PTA提交列表
2、设计思路
定义一个子函数,实现将op1、op2的值传入子函数
在子函数以指针的形式定义sum,diff,即float *psum, float *pdiff,实现在子函数改变和与差的值得同时,主函数的和差也随之改变
然后在子函数进行计算,即*psum=op1+op2; *pdiff=op1-op2;
结构图:
代码截图:
3、调试过程
本题一开始的时候出现编译错误,是因为不小心将调试的代码也一并写进去提交;本题需要注意的是指针的定义类型要与实参类型一致,其余的与平时的计算无明显差异
题目二、6-4 字符串的连接(15 分)
本题要求实现一个函数,将两个字符串连接起来。
函数接口定义:
char *str_cat( char *s, char *t );
函数str_cat
应将字符串t
复制到字符串s
的末端,并且返回字符串s
的首地址。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define MAXS 10
char *str_cat( char *s, char *t );
int main()
{
char *p;
char str1[MAXS+MAXS] = {'\0'}, str2[MAXS] = {'\0'};
scanf("%s%s", str1, str2);
p = str_cat(str1, str2);
printf("%s\n%s\n", p, str1);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
abc
def
输出样例:
abcdef
abcdef
1、本题PTA提交列表
2、设计思路
本题实质上就是要写函数strcat的原型;
定义子函数str_cat,
用指针的形式将两个字符串传入子函数,即char *s,char *t;
先计算s这个字符串的字符数,当s【i】!='\0' 时让i自加,退出循环时i为字符数;
然后在用循环,让s【i+1】=t【0】;以此类推,直到t【i】='\0'结束
则s为连接完成的字符串
结构图:
代码截图:
3、调试过程
出错的原因是因为没有返回值,本题子函数的定义是char类型的,必须要有返回值;
题目三、6-6 使用函数实现字符串部分复制(20 分)
本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。
函数接口定义:
void strmcpy( char *t, int m, char *s );
函数strmcpy
将输入字符串char *t
中从第m
个字符开始的全部字符复制到字符串char *s
中。若m
超过输入字符串的长度,则结果字符串应为空串。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 20
void strmcpy( char *t, int m, char *s );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */
int main()
{
char t[MAXN], s[MAXN];
int m;
scanf("%d\n", &m);
ReadString(t);
strmcpy( t, m, s );
printf("%s\n", s);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
7
happy new year
输出样例:
new year
1、本题PTA提交列表
2、设计思路
本题实质上就是写strcpy函数的原型
定义i,j
让i=m-1;
在条件*(t+i)!='\0'满足时*(s+j)=*(t+i);i++;j++;*(s+j)='\0';
最后s为所求
结构图:
代码截图:
3、调试过程
本题编译错误是因为我将Readingstring的函数原型也表示出来了,导致编译错误
二、同学代码互评
我们两个人的思想差不多,只是我的输出是在子函数实现的,而彦婵的代码是在主函数进行输出
我更喜欢我的代码
三、pta排名截图
四、本周学习总结
通过本章指针学习,我学会了数组名是指一个首地址,所以,point=a(point是一个指针,a是一个数组名), a的前面不需要加&符号。
变量名指的是一个值,a[1]指的也是一个值,这些值包含着一个或多个字节,在想要让指针指向这些值的字节的地址时,
需要在变量名以及a的前面加上&符号,即意思是要让指针赋值符号(=)右边的东西是地址。
数组或变量的数据是一个一个字节的存放的,而且字节的地址是呈现连续的,赋值的时候,从左到右看
越往右,字节的地址号越大。因此,对于多字节数据类型的数组而言,看起来有种“首尾相连”的效果,
因为一个元素的最低位字节其地址的加一地址对应的字节,就是下一个元素的最高位字节。
简单点来说就是低地址存放高字节,这种现象称为大端排列(常用单片机)。注意:有些时候则是低地址存放低字节,这种现象称为小端排列(ARM)
指针可分为:函数指针,数组指针(多维指针),变量指针,结构体指针。
posted on 2018-01-20 13:30 huangyilin 阅读(1111) 评论(0) 编辑 收藏 举报