函数指针(那些让人发笑的垃圾函数)

在学习函数指针时,由于自己的知识水平不够扎实,写了些错误的一些函数。写出来给看看。

 

第一步还是傻傻分不清指针函数定义的区别,下面写出两类不同的函数的定义。

    ~ 函数类型 (*函数名) (参数表列)  ;

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 &sum;

 }

    

 

 

 

 

当然也有一些奇葩的声明比如:

 

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 &sum;
 
 }

 如有错误还需大家指出。

文章名是那些令人发笑的垃圾函数。其实仅仅是因为昨晚写了一段有问题的垃圾代码而不自知,最终还被朋友嘲笑。

 

 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.给自己提个醒。

 

posted on 2017-09-08 16:05  Aron·Zhou  阅读(287)  评论(1编辑  收藏  举报