1.函数基础
(1)简单的求和函数。
#include <stdio.h>
int sum(int n);
int sum(int n)
{
int sum=0;
int i;
for(i=1;i<=n;i++)
{
sum=sum+i;
}
return sum;
}
int main()
{
int n,k;
scanf("%d",&n);
k=sum(n);
printf("%d",k);
}
此处函数返回的是一个整型数值。
(2)交换函数
1.无意义的交换函数
#include <stdio.h>
void swap(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}
int main()
{
int a=5;
int b=6;
swap(a,b);
printf("%d %d",a,b);
}
该段代码中swap函数中的a和b,与main函数中的a和b是完全不同的,swap函数中的a和b只在本身函数体内存在,所以无法实现交换。
2.正确的交换函数
#include <stdio.h>
void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
int main()
{
int p=5;
int q=6;
swap(&p,&q);
printf("%d %d",p,q);
}
该段代码在swap函数中将p和q在内存中的地址进行了操作,不会受到形参和实参的影响。
3.在向一个函数传递数组时,传递的不是该数组,而是该数组首元素的地址。
2.指针函数与函数指针
(1)指针函数
#include <stdio.h>
char *input(char);
char *input(char c)
{
if(c=='a')
return"apple";
else if(c=='b')
return"banana";
else if(c=='c')
return"cat";
else
return"none";
}
int main()
{
char k;
printf("请输入一个字母");
scanf("%c",&k);
printf("%s\n",input(k));
}
易错点:
#include <stdio.h>
char *input(char);
char *input(char c)
{
char c1[]="apple";
char c2[]="banana";
char c3[]="cat";
char c4[]="none";
if(c=='a')
return c1;
else if(c=='b')
return c2;
else if(c=='c')
return c3;
else
return c4;
}
int main()
{
char k;
printf("请输入一个字母");
scanf("%c",&k);
printf("%s\n",input(k));
}
在dev c++上这样的代码是可以运行的,但是会有警告:[Warning] function returns address of local variable [-Wreturn-local-addr]。因为返回局部变量的指针是不允许的,该代码中c数组就是局部变量,return c[ ]这样的写法时不允许的。
指针函数顾名思义,是一个函数,而它的返回值是一个指针,该段代码返回值是字符串的第一个字符的地址,在printf函数中输出时,给其一个字符串的首地址,它会一直在内存中读取并输出该字符串后续的字符,知道找到’\0’为止。所以会输出一个字符串。
(2)函数指针
#include <stdio.h>
int kang(int,int);
int kang(int a,int b)
{
return a+b;
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
int(*p)(int,int);
p=kang; //该表达等价于int(*p)(int,int)=kang;
printf("%d",(*p)(a,b));
}
函数指针顾名思义是一个指针,而这个指针指向一个函数,定义表达为 指针类型+(*p)(变量类型)。
(3)函数指针难点。
//实现函数里引用其它函数可以将指向某一个函数的函数指针作为另外一个函数的一个变量
#include <stdio.h>
int add(int,int);
int sub(int,int);
int kang(int (*fp)(int,int),int,int);
int add(int num1,int num2)
{
return num1+num2;
}
int sub(int num1,int num2)
{
return num1-num2;
}
int kang(int(*fp)(int,int),int num1,int num2) //int(*fp)(int,int) 这个东西的意思是需要给这个变量传递一个int型的函数(函数)
{
return (*fp)(num1,num2);
}
int main()
{
printf("3+5=%d\n",kang(add,3,5));
printf("3-5=%d\n",kang(sub,3,5));
}
该段代码总结为一句话:实现函数里引用其它函数可以将指向某一个函数的函数指针作为另外一个函数的一个变量。
3.总结
通过学习,我认为函数与指针的难点在于函数指针与指针函数的表达与应用。刚学完的我,只停留在能看懂代码,但并不能灵活使用函数指针与指针函数去简化一些实际问题。
关于函数,有很多易错点,比如:对形参与实参的错误使用、利用指针函数返回局部变量的指针指针与指针函数表达的形式,以及对函数传入一个数组的理解等等。