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

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

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

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

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.给自己提个醒。
时间: 2024-09-29 15:52:57

函数指针(那些让人发笑的垃圾函数)的相关文章

C语言:通过函数指针来完成两个数的加减乘除(函数指针当做参数使用)

// //  main.c //  Function_pointer // //  Created by mac on 15/8/2. //  Copyright (c) 2015年 bjsxt. All rights reserved. //  要求:将函数指针做参数来求两个整数的和.差.积.商. //知识点:函数指针就是一个指向函数的指针,通过指针指向要调用的函数来完成操作.其实,这个指针就是指向函数的入口地址. //切记:要被调用的函数必须和函数指针的声明的一样(包括:返回值类型.参数个数

函数指针(pointer to function)——qsort函数应用实例

一,举例应用 在ACM比赛中常使用 stdlib.h 中自带的 qsort 函数,是教科书式的函数指针应用示范. #include <stdio.h> #include <stdlib.h> int comp(const void*a, const void*b) { return *(int*)a - *(int*)b; } int main() { int n = 5; int *array = (int*)malloc(n*sizeof(int)); int i = 0; f

辨析函数指针变量和指针型函数

在上一篇随笔(顺序表基本操作算法的代码实现)中,LocateElem()函数的第三个形参的形式是: Status (*compare)(Elemtype e,Elemtype temp); 这是一个函数指针变量,借此机会记录一下函数指针变量和指针型函数的区别. 一.写法上的区别 函数指针变量 指针型函数 int (*function)(int i); int  *function(int i){} 上面是一个例子,可看到函数指针变量只是在:*function处比指针型函数多了一对小括号,下面是两

C++函数指针详解

学习c++的过程中,指针是难点,熟悉了指针之后,还有一个让人很蛋疼的难点,那就是函数指针了.本博文详细介绍一下常见的各种坑爹的函数指针. 至于指针的详细学习,推荐这篇博文C++指针详解 与数据一样,函数也有地址,函数的地址就是内存中存放函数语言代码的起始地址.函数指针就是指向这个地址.函数指针所指向的类型,就是函数本身.我们知道,指针所指向类型代表了指针所指向的内存区域的大小.所以函数指针所指向的类型,就是函数在内存中所占据内存的大小.知道了函数的起始地址和大小,所以函数指针可以很轻易的代替函数

新手,对函数,函数指针,回调函数, 函数指针作为函数的返回值和block的一些见解

很多初学者,学c语言时,看到函数都觉得难,我也是,一开始觉得函数太难了,后来慢慢就理解了 第一:函数 在c语言中最简单的函数一般有四种: 1, 无返回值, 无参数. 2, 无返回值,有参数. 3, 有返回值,无参数. 4, 有返回值,有参数 1, 无返无参  定义方式:      void 函数名(); 一般不怎么用这种形式的函数,可用来输出,打印 void functionOne() { printf("无返回值,无参数"); // 没有返回值不能写return } int main

指针数组,数组指针,指针函数,函数指针,二级指针详解

先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char  *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[]是一个数组,暂时把p[]看成是q,也就是char *(q),定义了一个指针q,只不过q是一个数组罢了,故定义了一个数组,数组里面的数据是char *的,所以数组里面的数据为指针类型.所以char *p[4]是四个指针,这四个指针组成了一个数组,称为指针数组,既有多个指针组成的数组. char(*p

C 中typedef 函数指针的使用

类型定义的语法可以归结为一句话:只要在变量定义前面加上typedef,就成了类型定义.这儿的原本应该是变量的东西,就成为了类型. int integer;     //整型变量int *pointer;   //整型指针变量int array [5]; //整型数组变量int *p_array [5]; //整型指针的数组的变量int (*array_pointer) [5];//整型数组的指针的变量int function (int param);//函数定义,也可将函数名看作函数的变量int

Callback函数详解(我感觉,回掉函数的本质是函数指针,在业务做循环处理的时候,调用一下通知外部)

2010年的最后一天了,转载一篇自己认为还不错的文章与大家分享.希望对大家有所帮助. 一,回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函数)有何不同呢? 使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数. 而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利

成员函数指针与高性能的C++委托

成员函数指针与高性能的C++委托(上篇) 撰文:Don Clugston 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(closure)"或"委托 (delegate)")在一些语言中已经证明了它宝贵的价值.在Delphi (Object Pascal)中,面向对象的函数指针是Borland可视化组建库(VCL,Visual Component Library)的基础.而在目前,C#使"委托&