C语言之函数指针用法总结

一、函数返回指针值

函数是实现特定功能的程序代码的集合,函数代码在内存中也要占据一段存储空间 (代码区内),
这段存储空间的起始地址称为函数入口地址。C语言规定函数入口地址为函数的指针,
即函数名既代表函数,又是函数的指针(或地址)。

1、函数的返回类型可以是指针类型,即函数返回指针值,其定义形式为:

2、函数返回指针值,需要考虑指针有效性的问题,例如: 

这个返回有问题,因为它返回的是函数局部变量a的地址值。当函数调用结束后,
函数局部变量会释放,变成未知对象。在return语句时,&a还是有效的,
但主调函数获得这个地址时已经是无效的。

3、函数返回的分类
①由主调函数传递进去的有效指针值。
②由动态分配得到的指针值。
③0值指针,表示无效指针。

4、例题:编写函数stringstr, 实现strstr函数的查找子字符串功能。

stringstr函数的作用是在string字符串中查找有无与strCharSet相同的字符串。
如果有,返回该字符串在string中的位置的指针,否则返回空指针表示没有相同的字符串。

 1 #include<stdio.h>
 2 const char *stringstr(const char *string,const char *strCharSet){
 3     const char* p=string,*r=strCharSet;
 4     while(*p!=‘\0‘){
 5         while(*p++==*r++); //关键:比较直到字符串结束或不相等为止
 6         if(*r==‘\0‘) return p; //包含strCharSet返回string当前指针
 7         r=strCharSet; //重新指向strCharSet
 8         p=++string; //从string下一个字符起始
 9     }
10     return NULL; //不包含strCharSet返回NULL
11 }
12
13 int main(){
14     char s1[80]="*A*AB*ABC*ABCD",s2[80]="ABC";
15     const char *ptr;
16     ptr=(char *)stringstr(s1,s2);
17     if(ptr!=NULL) printf("%s\n",ptr);
18     return 0;
19 }

程序第5行是字符串比较的关键,无论p或是r指向的字符串,只要指向的
字符串有不相同的字符,循环就结束。此时有三中情况:
①p和r均没有指向两个字符串的结束,说明字符串中间就有字符不相等。
②p指向字符串结束,r没有指向字符串的结束,说明r后面还有没有比较的字符。
③p尚未指向字符串结束,r指向字符串的结束。
显然,第③种情况说明p所指向的字符串包含了strCharSet字符串,则r应指向结束符。

原文地址:https://www.cnblogs.com/ZengBlogs/p/12208184.html

时间: 2024-10-06 10:32:54

C语言之函数指针用法总结的相关文章

可读性很强的C语言的函数指针定义

通常C/C++程序里面要用到大量的指针,其语法非常难以阅读.比如下面的vp指针类型: #include <iostream> using namespace std; typedef void (*vp) (float&,float&); void foo(float &a,float &b) { a = a + b; } int main() { // float a=1; float b=2; vp t=&foo; t(a,b); cout <

C/C++函数指针用法总结

 C++函数指针 一函数指针介绍 函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关.举例如下: int add(int nLeft,int nRight);//函数定义 该函数类型为int(int,int),要想声明一个指向该类函数的指针,只需用指针替换函数名即可: int (*pf)(int,int);//未初始化 则pf可指向int(int,int)类型的函数.pf前面有*,说明pf是指针,右侧是形参列表,表示pf指向的是函数,左侧为int,说明pf指向的函数

【C语言】函数指针与回调函数

在C语言中:指针是C语言的特色,有着各种各样的指针,普通的变量指针,常量指针,数组指针,指针数组,函数指针,指针函数.我们就讲一下函数指针与回调函数吧 首先关于函数指针,其实很简单. 对于一个函数指针来说,顾名思义,就是一个指向函数的指针,需要知道的是,对于指针而言,他总是存储一块地址,地址里面有着一个,一组,或者一块数据,在函数中,函数的存储是放在代码段的,每个函数都有着一个函数首地址,调用了这个地址相当于调用的这个函数. 具体的可以观看我的这篇博客,其中就通过在内存阶段改变栈帧返回值,成功的

函数指针用法

函数指针实际上是个指针,只不过这个指针指向一个函数,在调用函数的时候,只要使用指向这个函数的指针就可以了.函数指针声明语法如下: T (*the_name)([parameter_list]); the_name便是函数指针的名字,它指向一个函数,返回类型为T,参数列表parameter_list可选,参数列表中只需列出参数类型即可,参数名字可有可无.如下例子: int (*p_add)(int, int); p_add这个函数指针指向一个函数,返回类型为int,参数列表是两个int类型的参数.

C语言中函数指针

函数调用的方法有两种分别如下: void Fun(void) { //do something } int main(void) { ... Fun(); ... return 0; } void Fun(void) { //do something } int main(void) { ... void (*p)(void); p=Fun; p(); return 0; } 上面两种方式都可以调用函数,第二种方式在回调函数中用的最多,尤其是在操作系统的任务切换中.那么我们就重点来分析下第二种方

c语言中函数指针和指针函数

一.什么是函数指针: 函数指针本质上也是指针,我们所写函数代码在内存中会被分配一段专门的储存空间,这段储存空间的地址就是函数的地址,既然是地址,就可以用指针去表示,自然就有了函数指针. 二.函数指针的用法: 1.首先明确函数指针怎么申明.形如:返回值类型 (*变量名)(参数类型1,参数类型2,...) 例如 int (*p) (int,int) 2.我们还需要了解如何通过指针调用函数. (*p)(3,5); 3.如何给该类型的指针赋值: 非常简单,直接将函数名赋给指针即可,因为函数名即为函数的首

剑指offer_面试题14_调整数组顺序使奇数位于偶数前面(函数指针用法)

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 1.一般想法,不考虑时间复杂度: 每次遍历数组,碰到一个偶数就拿出来,将后面所有数字向前挪动一位,在将该偶数放到最后. 2.利用冒泡排序的思想,两个指针,一前以后,如果前为偶数,后为奇数,就交换. 算法如下: void Reorder_array(int p[],int length) { if(NULL == p || length <= 0) return; int i

C语言中函数指针数组浅析

发现问题 问题分析 示例代码 发现问题 今天,在阅读Linux内核中关于socket的源代码时,遇到了下面一段代码: struct proto_ops { int family; struct module *owner; int (*release) (struct socket *sock); int (*bind) (struct socket *sock, struct sockaddr *myaddr, int sockaddr_len); int (*connect) (struct

c语言定义函数指针和typedef简写

二种方法来定义函数指针 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<Windows.h> 4 5 int add(int a, int b) 6 { 7 return a + b; 8 } 9 10 //void msg(char s[]) 11 //void (*p)(char s[]) 函数指针的定义方法 12 //void (*)(char *s) 函数指针的类型 13 14 void msg(char