马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1.不是说不可以返回局部变量的指针 ,局部变量的作用域只是函数内,下面这个例子就是,报错了,为什么在下下面这个代码里面,
select函数,就是做了同样的操作,返回了函数名,函数名是一个地址(地址不用指针指向它,是不是不算指针),没有报错
2.下面这个注释掉的例子,定义的是指针函数,是一个函数,返回的是一个指针
下下面这个例子,定义的是函数指针,是一个指针,指向的是函数,返回的是函数的返回值
是不是只有指针函数里面不可以返回局部变量的指针???????????????????
/*
//报错
char *getWord(char);
char *getWord(char c)
{
char str1[] = "apple";
char str2[] = "banana" ;
char str3[] = "CAT" ;
char str4[] = "dog" ;
char str5[] = "none" ;
switch(c)
{
case 'A':return str1; ////不可以返回局部变量的指针 ,局部变量的作用域只是函数内
case 'B':return str2; //这的字符串就是一个字符指针,返回的是当前指针的首地址,不可以。。。
case 'C':return str3;
case 'D':return str4;
default:return str5;
}
}
int main ()
{
char input;
printf("enter a letter:");
scanf("%c",&input);
printf("%s\n",getWord(input));
return 0;
}
*/
#include <stdio.h>
//************函数指针作为返回值*********
int add(int,int);
int sub(int,int);
int calc(int (*fp)(int,int),int,int);
//运算符是有优先级的, 括号的优先级高于取值运算符,从左到右,
//先是定义了一个函数select,参数是一个字符变量,有一个返回值,返回的是一个指针,
//指针指向的是一个返回整型并且带有两个参数的函数
int (*select(char op))(int,int); // 便于理解,(*)(int,int),就是一个函数指针
int add(int num1,int num2)
{
return num1 + num2;
}
int sub(int num1,int num2)
{
return num1 - num2;
}
int calc(int (*fp)(int,int),int num1,int num2)
{
return (*fp)(num1,num2);
}
int (*select(char op))(int,int)
{
switch(op)
{
case '+':return add;
case '-':return sub;
}
}
int main()
{
int num1,num2;
char op;
int (*fp)(int,int);
printf("enter a function(such as 1+3):") ;
scanf("%d%c%d",&num1,&op,&num2);
fp = select(op);
printf("%d %c %d = %d\n",num1,op,num2,calc(fp,num1,num2));
return 0;
}
首先,函数是可以返回指针(地址)的,这在语法上没有任何问题,比如说,写成这样就没有任何问题。 char *getWord(char c)
{
char *str1 = "apple";
char *str2 = "banana" ;
char *str3 = "CAT" ;
char *str4 = "dog" ;
char *str5 = "none" ;
switch(c)
{
case 'A':return str1;
case 'B':return str2;
case 'C':return str3;
case 'D':return str4;
default:return str5;
}
}
当然,有些写法是有问题的,比如 int * fun(int n)
{
int a = n;
return &a;
}
上面的函数在语法上是对的,但有些编译器会提出警告,有些编译器会报错。
原因是: 局部变量是在栈上分配的内存,当离开函数后,这段内存就被标记为未使用。把这段内存返回出去可能出现把一段内存同时分配给两个变量的情况。
栈的作用有:函数调用传递参数,保存函数调用返回地址,保存寄存器的值,分配局部变量。
而函数
int (*select(char op))(int,int)
他返回的是一个函数的地址,这个地址是你的程序被系统载入内存时就已分配好的(你可以理解为跟全局变量一样),而不是在栈上,是不会被破坏的。
所以将它返回出去不存在任何问题。
|