第十次作业总结
实验1.计算两数的和与差
#include<stdio.h> void sum_diff(float op1,float op2,float*psum,float*pdiff) { if(NULL==psum||NULL==pdiff) { printf("res mem is NULL\n"); return ; } *psum=op1+op2; *pdiff=op1-op2; } int main() { float num1,num2,sum,diff; printf("Input op1 op2:"); scanf("%d%d",&num1,&num2); sum_diff(num1,num2,&sum,&diff); printf("The sum is:%.2f\n",sum); printf("The diff is:%.2f\n",diff); return 0; }
实验2.利用指针找最大值
#include<stdio.h> int main() { void findmax(int *px,int *py,int *pmax); int x1,x2,max=0; printf("输入px,py:"); scanf("%d%d",&x1,&x2); findmax(&x1,&x2,&max); printf("max=%d\n",max); return 0; } void findmax(int *px,int *py,int *pmax) { if(*px<*py){ *pmax=*py; } else *pmax=*px; }
实验3.拆分实数的整数与小数部分
#include<stdio.h> int main() { float a,c; int b; void splitfloat(float x,int *intpart,float *fracpart); printf("输入一个实数x:"); scanf("%f",&a); splitfloat(a,&b,&c); printf("整数部分:%d,小数部分:%f\n",b,c); return 0; } void splitfloat(float x,int *intpart,float *fracpart) { *intpart=(int)x; *fracpart=x-(*intpart); }
一.知识点:
1.地址和指针:在程序运行过程中,变量或者程序代码被存储在以字节为单位组织的存储器中;在C语言中,如果定义了一个变量,在编译时就会根据该变量的类型给它分配相应大小的内存单元。计算机为了对内存单元中的数据进行操作,一般是按”地址“存取的,也就是说对内存单元进行标识编号
2.在C程序中还有一种使用变量的方法,即通过变量的地址进行操作:用指针(point)访问内存和操纵地址
C语言使用指针对变量的地址进行操作,指针是用来存放内存地址的变量,如果一个指针变量的值是另一个变量的地址
3.指针变量的定义:如果在程序中声明一个变量并使用地址作为该变量的值,那么这个变量就是指针变量。
定义指针变量的一般形式为:类型名 *指针变量名;
类型名制定指针变量所指向变量的类型,必须是有效的数据类型,如int,float,char等。指针变量名是指针变量的名称,必须是一个合法的标识符。
定义指针变量要使用指针声明符*。
例如:int *p; p是整型指针,指向整型变量
float *fp; fp是浮点型指针,指向浮点型变量
char *cp; cp是字符型指针,指向字符型变量
4.指针的基本运算:如果指针的值是某个变量的地址,通过指针就能间接访问那个变量,这些操作由取地址运算符&和间接访问运算符*完成,此外,相同类型的指针还能进行赋值,比较和算数运算。
(1).取地址运算和间接访问运算
&取地址运算符,给出变量的地址
int *p,a=3;
p=&a;
指针变量的类型和它所指向变量的类型相同,把a的地址赋给p,即p指向a。 * 间接访问运算符,访问指针所指向的变量;*p 指针变量p所指向的变量
(2).赋值运算:一旦指针被定义并赋值后,就可以如同其他类型变量一样进行赋值运算
例如:int a=3,*p1,*p2; /*定义整型变量指针p1和p2*/
p1=&a; /*使指针p1指向整型变量a*/
p2=p1;
将变量a的地址赋给指针p1,再将p1的值赋给指针p2,因此指针p1和p2都指向变量a,此时,*p1、*p2和a访问同一个存储单元,它们的值一样
给指针赋值是使指针和所指向变量之间建立关联的必要过程,指针之间的互相赋值只能在相同类型的指针之间进行,可以在定义时对指针进行赋值,也可以在程序运行过程中根据需要对指针重新赋值,但要特别注意:指针只有在被赋值以后才能被正确使用。
5.指针变量的初始化:C语言中的变量在引用前必须先定义并赋值,指针变量在定义后也要先赋值再引用,在定义指针变量时,可以同时对它赋初值
例如:int a;
int *p1=&a; /*在定义指针p1的同时给其赋值,使指针p1指向变量a*/
int *p2=p1; /*在定义指针p2的同时对其赋值,使p2和p1的值相同*/
以上对指针p1和p2的赋值都是在定义时进行的,使得指针p1和p2都指向变量a
在进行指针初始化的时候需要注意以下几点
(1)在指针变量定义或者初始化时变量名前面的”*“只表示该变量是个指针变量,它既不是乘法运算符也不是间接访问符
(2)把一个变量的地址作为初始化值赋给指针变量时,该变量必须在此之前已经定义,因为变量只有在定义后才被分配存储单元,它的地址才能赋给指针变量
(3)可以用初始化了的指针变量给另一个指针变量作初始化值
(4)不能用数值作为指针变量的初值,但可以将一个指针变量初始化作为一个空指针
(5)指针变量定义时的数据类型和它所指向的目标变量的数据类型必须一致,因为不同的数据类型所占用的存储单元的字数节不同
需要再次指出的是,定义指针变量后,就可以使用它,但必须先赋值后引用。指针如果没有被赋值,它的值是不确定的,即它指向一个不确定的单元,使用这样的指针,可能会出现难以预料的结果,甚至导致系统错误
6.指针作为函数的参数:函数参数包括实参和形参,两者的类型要一致,可以是指针类型,如果实参是某个变量的地址,相应的形参就是指针
7.指针作为函数参数的应用:
要通过函数调用来改变主调函数中某个变量的值:
(1)在主调函数中,将该变量的地址或者指向该变量的指针作为实参
(2)在被调函数中,用指针类型形参接受该变量的地址
(3)在被调函数中,改变形参所指向变量的值
二.实验过程中遇到的问题及解决方法:
对于指针所指向变量的操作不是很理解,不清楚是谁指向谁,谁的值赋给谁,在通过看书和看老师上课ppt上讲的例子,明白了指针操作的大概流程,但还得多做几个例题加强理解。
三.心得体会:这次的作业虽然只有仅仅三道题,却已经把我搞得晕头转向了,感觉指针理解起来有点费劲,所以需要在课下多看书,多做练习题加以巩固,这样在习题中试着理解指针,还有老师上课讲的例题也要看,尽快掌握指针的操作。