zoukankan      html  css  js  c++  java
  • 函数指针(那些让人发笑的垃圾函数)

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

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

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

    int (*function)(int ,char );

      这个定义含义就是function是一个函数指针,指向函数原型为(有两个int形参,返回值为int 的函数)

    #include<stdio.h>
    int sum(int i,int j)
    {
    printf_s("指针调用函数成功
    ");
    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
    ",*ii);
     8 return ii;
     9 }
    10 
    11 int main()
    12 {
    13 double *pointer =NULL;
    14 pointer =ppf(2);
    15 printf_s("
    输出*pointer =%ld",*pointer);
    16 return 0;
    17 }
    朋友一语道破,我这水平也真的还是初学者还是不如。呵呵。
    第一:指针的定义是将指针定义为空指针,也没有给指针有效的地址。所以这是第一大错误。
    第二:输出类型里面应该写%lf,我却写了%ld.给自己提个醒。
  • 相关阅读:
    bzoj2190[SDOI2008]仪仗队(欧拉函数)
    洛谷P3601签到题(欧拉函数)
    bzoj2818 Gcd(欧拉函数)
    poj2104 K-th Number(主席树静态区间第k大)
    只要有它,你就永远不会被打垮!
    网站美化常见CSS
    虚拟机安装CentOS6.4
    提高工作效率是有秘诀的
    不要消费信任
    项目经理必备7要素
  • 原文地址:https://www.cnblogs.com/zhouhaocheng---yijianqinxin/p/7491842.html
Copyright © 2011-2022 走看看