函数指针(那些让人发笑的垃圾函数)
在学习函数指针时,由于自己的知识水平不够扎实,写了些错误的一些函数。写出来给看看。
第一步还是傻傻分不清指针函数定义的区别,下面写出两类不同的函数的定义。
~ 函数类型 (*函数名) (参数表列) ;
int (*function)(int ,char );
这个定义含义就是function是一个函数指针,指向函数原型为(有两个int形参,返回值为int 的函数)
#include<stdio.h> int sum(int i,int j) { printf_s("指针调用函数成功\n"); return 0; } int main() { int (*function)(int ,int ); function = sum;
(*function)(0,0); //调用函数方式一
function(0,0); //调用方式二
return 0; }
这两种调用方式都可以,但是要说解释却是倍受争议的。有两个学派一种学派认为function是函数指针而*function是函数,因此应将(*function)()用作函数调用。
另一学派认为,由于函数名是指向该函数的指针,指向函数的指针的行为应与函数名相似,因此应将函数function()用作函数调用使用。--摘自C++ primer plus(第六版)
至少C++是允许是这样使用的。
函数类型 *函数名 (参数表列);
int *function(int ,int );
这里这个function的含义是一个函数名,总之它是一个函数,不是一个函数指针。这个函数具有两个int 类型的形参。并且返回一个int指针。
这里某些人在看其他人的文章时就会很奇怪,会将这个声明误以为是函数定义。会很奇怪没有形参名字该如何用。其实这样的
#include<stdio.h> int *function (int,int); int sum; int main() { int *p; p = function(22,34); printf_s(“*p = %d”,*p); return 0; } int *function(int i,int j) { i++; j++; sum =i+j; return ∑ }
当然也有一些奇葩的声明比如:
int *function (int i , int , int );
在这里就涉及到函数的的参数表列在会以堆栈的方式来处理。我们也可以通过指针来访问到后面没有形参名的数据。
#include<stdio.h> int *function(int i, int,int); int sum; int main() { int *p; p = function(2, 34,22); printf_s("*p = %d", *p); return 0; } int *function(int i, int, int) { int *p = &i + 1; while(i--) { sum += *p; p++; } return ∑ }
如有错误还需大家指出。
文章名是那些令人发笑的垃圾函数。其实仅仅是因为昨晚写了一段有问题的垃圾代码而不自知,最终还被朋友嘲笑。
1 #include<stdio.h> 2 double *ppf(int i) 3 { 4 double *ii = NULL; 5 i++; 6 *ii = i; 7 printf_s("输出*ii =%ld\n",*ii); 8 return ii; 9 } 10 11 int main() 12 { 13 double *pointer =NULL; 14 pointer =ppf(2); 15 printf_s("\n输出*pointer =%ld",*pointer); 16 return 0; 17 }
朋友一语道破,我这水平也真的还是初学者还是不如。呵呵。
第一:指针的定义是将指针定义为空指针,也没有给指针有效的地址。所以这是第一大错误。
第二:输出类型里面应该写%lf,我却写了%ld.给自己提个醒。
以前我总是逃避,我想好好面对余生。