指针

一、PTA实验作业

题目一、6-1 计算两数的和与差(10 分)

本题要求实现一个计算输入的两数的和与差的简单函数。

函数接口定义:

void sum_diff( float op1, float op2, float *psum, float *pdiff );

其中op1op2是输入的两个实数,*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编辑  收藏  举报