代码改变世界

作业十 指针+总结

2016-11-27 15:36  zlt.Santorini'Ly  阅读(201)  评论(0编辑  收藏  举报

计算两数的和与差

#include<stdio.h>
void sum_diff(float op1,float op2,float *psum,float *pdiff);

int main(void)
{
    float op1,op2,sum,diff;
    printf("input op1 and op2:");
    scanf("%f%f",&op1,&op2);
    sum_diff(op1,op2,&sum,&diff);
    printf("%f+%f=%f,%f-%f=%f\n",op1,op2,sum,op1,op2,diff);
    
    return 0;
} 
void sum_diff(float op1,float op2,float *psum,float *pdiff)
{
    *psum=op1+op2;
    *pdiff=op1-op2;
}

 

利用指针找最大值

#include<stdio.h>
void findmax(int *px,int *py,int *pmax);

int main()
{
    int x,y,max;
    printf("input x and y:");
    scanf("%d%d",&x,&y);
    findmax(&x,&y,&max);
    printf("%d\n",max);
    
    return 0;
}
void findmax(int *px,int *py,int *pmax)
{
    if(*px<*py)
        *pmax=*py;
    else
        *pmax=*px;
}

 

拆分实数的整数与小数部分

#include<stdio.h>
void splitfloat(float x,int *intpart,float *fracpart);

int main()
{
    float x,fracpart;
    int intpart;
    printf("input x:");
    scanf("%f",&x);
    splitfloat(x,&intpart,&fracpart);
    printf("the intpart is:%d\n",intpart);
    printf("the fracaprt is:%f\n",fracpart);
    
    return 0;
}
void splitfloat(float x,int *intpart,float *fracpart)
{
    if(x<0)
        x=-x;
    *intpart=(int)x;
    *fracpart=x-*intpart;
}

 

 

一、知识点

1.指针变量

·一般形式:类型名  *指针变量名;

·定义指针变量要使用指针声明符*;

例如:int i,*p; (声明变量i是int类型,变量p是指向int型变量的指针。指针值可以是特殊的地址0,也可以是一个代表机器地址的正整数。)

·定义多个指针变量时,每一个指针变量前面都必须加上*;

指针变量的类型不是指指针变量本事的类型,而是指它所指向的变量的数据类型。无论何种类型的指针变量,它们都是用来存放地址的,因此指针变量自身所占的内存空间大小和它所指向的变量数据类型无关,尽管不同类型的变量所占的内存空间不同,但不同类型指针变量所占的内存空间大小都是相同的。

·指针变量被定义后,必须将指针变量和一个特定的变量进行关联后才可以使用它,也就是说,指针变量也要先赋值再使用,当然指针变量被赋的值应该是地址。

·定义指针变量:①指针变量名是一个标识符,要按照c标识符的命名规则对指针变量进行命名。

        ②指针变量的数据类型是它所指向的变量的类型,一般情况下一旦指针变量的类型被确定后,它只能指向同种类型的变量。

        ③在定义指针变量是需要使用指针声明符*,但指针声明符并不是指针的组成部分。例如:定义 int *p;说明p是指针变量,而不是*p。

2.指针的基本运算

·取地址运算和间接访问运算:

  单目运算符&用于给出变量的地址。(指针的类型和它所指向变量的类型必须相同)

  在程序中,“*”除了被用于定义指针变量外,还被用于访问指针所指向的变量,它也被称为间接访问运算符。

·赋值运算:

    ①一旦指针被定义并赋值后,就可以如同其他类型变量一样进行赋值运算。例如:

                        int a=3,*p1,*p2;

                        p1=&a;

                        p2=p1;

将变量a的地址赋给指针p1,再将p1的值赋给指针p2,因此指针p1和p2都指向变量a。此时,*p1、*p2和a访问同一个存储单元,它们的值一样。

:指针只有在被赋值以后才能被正确使用。

·指针变量的初始化

C语言中的变量在引用前必须先定义并赋值,指针变量在定义后也要先赋值再引用。在定义指针变量时,可以同时对它赋初值。例如:

          int a;

          int *p1=&a;

          int *p2=p1;

:①在指针变量定义或者初始化时变量名前面的“*”只表示该变量是个指针变量,它既不是乘法运算符也不是间接访问符。

  ②把一个变量的地址作为初始值赋给指针变量时,该变量必须在此之前已经定义。因为变量只有在定义后才被分配存储单元,它的地址才能赋给指针变量。

  ③可以用初始化了的指针变量给另一个指针变量作初始化值。

  ④不能用数值作为指针变量的初值,但可以将一个指针变量初始化为一个空指针。例如:int *p=1000;是不对的,而int *p=0;是将指针变量初始化为空指针。这里0是ASCII字符NULL的值。

  ⑤指针变量定义时的数据类型和它所指向的目标变量的数据类型必须一致,因为不同的数据类型所占用的储存单元的字节数不同。

3. 角色互换

·指针作为函数的参数

  引用调用:调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。采用引用调用机制需要在函数定义时将指针作为函数的形参,在函数调用时把变量的地址或者指向该变量的指针作为实参。在被调函数中,用指针类型形参接受该变量的地址,并改变形参所指向变量的值。

  如果希望函数调用能将多个计算结果带回主调函数,用return语句是无法实现的,而将指针作为函数的参数就能使函数返回多个值。

二、实验过程中遇到的问题及解决方法:

1.在进行编程是指针变量概念混淆。(首先得正确理解指针变量的定义,其次多做强化记忆、练习。)

2.指针变量不使用return语句返回,它能直接将指针作为函数的参数就能使函数返回多个值。(还是在理解方面不到位,需要加深理解学习,多做练习总结。)

三、实验心得体会

指针变量的区分容易出现混淆,容易把地址和变量混在一起,没有真正理解指针变量的定义,总爱把“*”错误理解为指针变量。学习的内容在不断增多,难度也在随之增大,需要花更多的时间去理解学习,做更多的练习。