地址和指针:地址和指针是计算机中的两个重要概念,在程序运行过程中,变量或者程序代码被存储在以字节为单位组织的存储器中。在C语言中,如果定义了一个变量,在编译时就会根据该变量的类型给它分配相应大小的内存单元。
**要注意区分内存单元的内容和内存单元的地址。
前面学过把地址作为scanf()的输入参数的用法:例如:函数调用scanf(“%d”,&n),把输入的值存储到变量n所在的内存单元里,其中&n表示变量n的内存地址或存储位置。这里的&称为地址运算符,&是一元运算符。
指针变量的定义:如果在程序中声明一个变量并使用地址作为该变量的值,那么这个变量就是指针变量。
定义指针变量的一般形式为:
类型名 *指针变量名;
类型名指定指针变量所指向变量的类型,必须是有效的数据类型,如int,float,char等。指针变量名是指针变量的名称,必须是一个合法的标识符。
定义指针变量要使用指针声明符*。如:int i,*p;
在定义指针变量时,除了指针变量名,还需要说明该指针变量所指向的内存空间上所存放数据的类型。
**指针声明符*在定义指针变量时被使用,说明被定义的那个变量是指针。
如果未加声明,把指针和指针变量同等对待,都是指存放内存地址的指针变量。
**定义多个指针变量时,每一个指针变量前面都必须加上*。
指针变量的类型指它所指向的变量的数据类型。
指针变量也要先赋值再使用,指针变量被赋的值应该是地址。
**指针p所指向变量的值加1:*p=*p+1
++*p
(*p)++
*p++等价于*(p++)
**说完知识点,来提一提作业,都是写加入指针的自定义函数,不能说难也不是不难,总的来说错误还是挺多的:
1.计算两数的和与差:
void sum_diff( float op1, float op2, float *psum, float *pdiff ) { *psum=op1+op2; *pdiff=op1-op2; }
这个自定义函数还是没有问题的,主要是主函数中 sum_diff(op1,op2,&sum,&diff);看书上这样子写:在函数中调用函数sum_diff()时,将变量sum和diff的地址作为实参,在被调用函数中用形参指针psum和pdiff分别接受地址,并改变了形参所指向变量的值。因此,函数main()中sum和diff的值也随之改变。
2.利用指针找最大值:
唯一不大懂的就是为什么自定义函数中用指针变量而不用指针
void findmax(int *px,int *py,int *pmax) { if(*px<*py) *pmax=*py; else *pmax=*px; }
这个其实昨天助教老师给了我另一个函数,而我却写错了,内容如下:
void findmax(int x,int y,int *pmax);
这个是函数体...
#include<stdio.h> void findmax(int x,int y,int *pmax); int main() { int x,y,*px,*py,max; printf("Enter x and y="); scanf("%d%d",&x,&y); findmax(*px,*py,&max); printf("The Max Number Is %d ",max); return 0; } void findmax(int x,int y,int *pmax) { int x,y,max; if(x<y) max=y; else max=x; }
然而这个是有错误的整个函数,其实我还是没有发现错哪了/(ㄒoㄒ)/~~
3.拆分实数的整数与小数部分:
函数为void splitfloat (double x, double *intpart, double *fracpart);
小数部分=number-整数部分,如果弄懂了前面两个题,也不会很难。
总结:这章不是很容易,要认真学!!!