指针与函数
----教学过程篇指针作为函数参数
函数的形参为指针变量,指针变量作实参预定义:
返回类型 函数名 1(参数类型 *P1,参数类型 *P2,…… )
使用:
函数名 1( P1,P2,…… )
指针作为函数参数
例子
#include<stdio.h>
main()
{ int a,b,c;
int *p1,*p2,*p3;
void turn(int *x,int *y,int *z)
scanf(“%d %d %d”,&a,&b,&c);
p1=&a;
p2=&b;
p3=&c;
turn(p1,p2,p3);
}
指针作为函数参数
void turn(int *x,int *y,int *z )
{ int temp;
if (*x>*y)
{ temp = *x;
*x = *y;
*y = temp;
}
if(*y>*z)
{temp = *z;
*z = *y;
*y = temp;
} printf(“%d\n%d\n%d\n”,*x,*y,*z);
}
指针作为函数参数
函数的形参为指针变量,变量地址作实参预定义:
返回类型 函数名 1(参数类型 *P1,参数类型 *P2,…… )
P1=&a; P2=&b; ……
使用:
函数名 1( &a,&b,…… )
指针作为函数参数
容易出现的错误一:
#include<stdio.h>
main ()
{ int a,b,*p1,*p2;
void change(int *x,int *y)
scanf(“%d %d”,&a,&b);
p1=&a; p2=&b;
change(&a,&b);
printf(“结果二,a =%d,b=%d”,a,b);
printf(“结果三,*P1= %d,*P2 =%d”,*P1,*P2);
}
指针作为函数参数
void change(int *x,int *y)
{ int *p;
p=x;
x=y;
y=p;
printf(“结果一,*x =%d,*y= %d”,*x,*y);
}
指针作为函数参数若上面程序的输入为:
1 2
则输出为:
结果一,*x=2,*y=1
结果二,a=1,b=2
结果三,*p1=1,*p2=2
指针作为函数参数
总结:
1.在函数中对指针形参的值进行交换,
不会影响到 a,b的值
2.函数形参指针的交换不会影响到函数实参指针作为函数参数
容易出现的错误二:
void change(int *x,int *y)
{ int *p;
*p=*x;
*x=*y;
*y=*p;
}
指针作为函数参数
总结:
指针变量 P没有赋初始值,因此它指向一个不确定的内存单元,可能导致不可预计的后果指针作为函数参数
思考:
若已经给指针 P赋了初始值,则程序的结果为什么?
若将该函数放到幻灯片六的程序中,结果又如何?
void change(int *x,int *y)
{ int i,*p;
p=&i;
*p=*x;
*x=*y;
*y=*p;
printf(“结果一,*x =%d,*y= %d”,*x,*y);
}
指针函数
指针函数指函数的返回值是指针的函数预定义:
函数类型 * 函数名(形式参数表)
例:
int *paixu(int a,int b)
{
return(&变量名 );或
return(指针变量 );
}
指针函数
#include<stdio.h>
#define n 10
main()
{ int a[n],*p,i;
int *sort(int b[]);
for (I=0,I<10,I++)
scanf(“%d”,&a[i]);
p=sort(a);
printf(“the num is:%d”,*p);
}
指针函数
int * sort(int b[])
{ int j,k,x,temp;
for(j=0,j<9,j++)
{
for(k=0,k<9-j,k++)
if(b[k]>b[k+1])
{ temp = b [k];
b[k] = b[k+1];
b[k+1]=temp;
}
}
x=b[0];
return(&x);
}
指针函数
总结指针函数的返回值一定要是地址,
并且返回值的类型也必须和函数的类型保持一致指向函数的指针
定义某个指针,使其指向某个函数,并通过该指针,可以调用函数预定义,
类型表示符 ( *指针变量名)() ;
例,
int (*p)();
调用:
p=函数名;
变量名 =(*p)(函数参数 );
指向函数的指针
#include<stdio.h>
main()
{ int a,b,c;
int maxdisplay(int x,int y);
int (*p)();
scanf(“%d%d”,&a,&b);
p= maxdisplay;
c=(*p)(a,b);
printf(“%d”,c);
}
指向函数的指针
int maxdisplay(int x,int y)
{ if (x>y)
return(x);
else
return(y);
}
指向函数的指针
总结指向函数的指针调用函数时,其实际参数的类型必须与函数的形式参数的类型保持一致另外指向函数的指针调用函数时可以返回任何类型的值,而指针函数的返回值的类型只能是指针变量