首页 > 其他分享 >函数指针和指针函数的使用

函数指针和指针函数的使用

时间:2024-08-02 20:56:32浏览次数:9  
标签:宏名 return 函数 int char printf 函数指针 指针

指针函数

1:本质函数,返回值为指针

1.2:格式:

数据数据 * 函数名(形参)

{

函数体

return 地址;//失败一般会返回NULL

}

#include<stdio.h>
#include<stdlib.h>

char *yue()
{
    // char a[32]="hello";//栈区,函数调用结束后空间被释放
    // char *s="hello";//常量区,不会被释放
    // 开辟堆区空间
    char *a = (char *)malloc(sizeof(a) * 40);
    if (a == NULL)//判断堆区空间是否开辟成功
    {
        printf("err");
        return NULL;
    }
    strcpy(a, "hello");//赋值
    return a;//返回值
}
int main(int argc, char const *argv[])
{
    char *p = yue();
    printf("%s\n", p);
    free(p);
    p = NULL;
    return 0;
}

2:函数指针

1:本质为指针,指向函数

数据类型 (*指针名)(参数列表);

数据类型: 与指向函数的返回值类型保持一致

参数列表:与指向函数的参数列表保持一致

int sub(int a,int b)
{
    return a+b;
}
int fun(int a,int b)
{
   return a-b; 
}

int test(int (*p)(int,int))  //函数指针
{
    printf("%d\n",p(3,4));
}

int main(int argc, char const *argv[])
{
    int (*p)(int,int);
    p=sub;
    printf("%d\n",p(2,3));
    p=fun;
    printf("%d\n",p(2,3));
    test(sub);
    test(fun);
    return 0;
}

2:函数指针数组的使用

1.概念:

本质是数组,数组中存放的是函数指针

2.格式:

数据类型 (*数组名[元素个数])(参数列表);

数据类型:和指向函数的返回值类型一致

参数列表:和指向的函数的参数列表一致

int (*a[2])(int,int)={sub,fun};
 for(int i=0;i<2;i++)
 printf("%d\n",a[i](3,4));

3:共用体的使用

union 名字{

成员列表;

};

注释:

1)所有成员共用同一块地址空间

2)以最后一次赋值为内存中的实际数据

3)共用体的大小为成员中类型最大的数据的大小

union value
{
    int a;
    char b;
}a;

int main(int argc, char const *argv[])
{
    a.a=0x12345678;
    if(a.b==0x78)
    printf("1\n");
    else if(a.b==0x12)
    printf("2\n");
    return 0;
}
4:枚举

没有初值时默认从零开始,向后一次递增

格式

enum 枚举类型名

{

常数1,

常数2,

};

5:存储类型

auto

自动型,修饰局部变量,存放在栈区(一般省略)

static

静态型,可以修饰局部变量和全局变量,也可以修饰函数

  1. 存放在静态区/全局区,.bss(未初始化的全局变量和静态变量) .data(初始化的全局变量和静态变量)
  2. 初始值默认为0,只初始化一次
  3. 限制作用域 ,修饰全局变量被限制仅能在本文件中使用,修饰局部变量,作用域被限制在本函数中,但会延长其生命周期
  4. 修饰函数,被限制仅能在本文件中使用
extern:外部引用,通过引用将其他文件中的全局变量和函数,放到本文件中使用 register:寄存器类型
6:条件编译:

6.1:宏是否定义(定义了执行code1,未定义执行code2)


#define  宏名

#ifdef  宏名
	/*code1*/ 
#else
	/*code2*/ 
#endif

6.2:根据宏值(若宏值为0则编译code2,不为0编译code1)

#define  宏名  值

#if  宏名
	/*code1*/
#else
	/*code2*/
#endif	

6.3:防止头文件重复:

注释:放在头文件中定义


#ifndef	宏名
#define   宏名
		/*code*/
#endif

标签:宏名,return,函数,int,char,printf,函数指针,指针
From: https://blog.csdn.net/m0_67638362/article/details/140866766

相关文章

  • 【C++】引用和指针的不同点
    引用和指针的不同点:(从使用的角度去对比,按自己的理解的角度去梳理,硬记很难记全,虽然不赢记大概率也记不全)1.引用概念上定义一个变量的别名,指针存储一个变量地址。2.引用在定义时必须初始化,指针没有要求。3.引用在初始化时引用一个实体后,就不能再引用其他实体;而指针可以在......
  • rows和range的区别--窗口函数
    目录1.rows和range关键字的区别2.例题:2.1 求最近三个月(前两个月和当前月)的累计销量2.2 计算最近3个月(前两个月和当前月)的累计销量1.rows和range关键字的区别rows和range关键字,都可以用来定义windowframe范围:rowsbetween上限and下线rangebetween上限and......
  • c语言中的地址与指针的概念,及变量的指针和指向变量的指针变量
    C语言中的地址、指针、以及变量的指针与指向变量的指针变量。1.地址(Address)在C语言中,每个变量在内存中都有一个唯一的内存地址。这个地址是变量存储的位置的标识符。可以通过& 运算符来获取一个变量的地址。#include<stdio.h>intmain(){  intx=10;  ......
  • c语言结构体的概述,定义结构体变量类型的方法,结构体变量的引用,结构体变量的初始化,结构
    1.C语言结构体的概述在C语言中,结构体(struct)是一种复合数据类型,用于将不同类型的数据组合在一起。它可以包含基本数据类型(如int、float、char等)以及其他结构体。结构体非常适合表示具有多种属性的复杂数据,如学生信息(包含姓名、年龄、成绩等)或坐标点(包含x和y坐标)。结构......
  • 一次函数杂谈
    update2024.7.25更改内容update2024.8.1更改内容+图床更改4.一次函数4.1函数的认识函数的定义:一般地,如果在一个变化过程中有两个变量\(x\)和\(y\),并且对于变量\(x\)的每一个值,变量\(y\)者都有唯一的值与它对应,那么我们称\(y\)是\(x\)的函数,其中\(x\)......
  • C primer plus 4.23 strlen函数
    一、strlen函数    **用来给出字符串的长度#include<stdio.h>#include<string.h>#definePRAISAE"Youareamextraordinarybeing."intmain(void) {   charname[40];   printf("Whatyourname?");      scanf("%s",nam......
  • 函数function2、栈
    目录设计函数函数调用的关系递归栈内存的5个区域数组作为函数参数设计函数能拆成函数的尽量拆成函数函数设计时尽可能考虑健壮性和拓展性,代码鲁棒性(健壮性)最强越好函数调用的关系调用者        被调用者intmain(void){printf("%d",getMonthdays(......
  • java如何避免NullPointerException(空指针异常,NPE)
    本文将简单的介绍nep以及如何避免npe1.npe简介空指针异常(NullPointerException)意思是指java中的异常类。当应用程序试图在需要对象的地方使用null时,抛出该异常。这种情况包括:调用null对象的实例方法。访问或修改null对象的字段。将null作为一个数组,获得其长度......
  • 嵌入式控制器(STM32)->栈指针累寄存器
    全局变量和局部变量从存储角度理解全局变量具有固定的地址,每次读写都是一个地址,而且它的存储区域从使用到使用结束一直存在局部变量再RAM中的地址不固定,采用先进后出的RAM区域,称为栈区寄存器分为通用寄存器(R0-R12)和特殊寄存器(R13-R15)ARM基本指令系统数据传送,数据操作,跳......
  • 大话C语言:第34篇 指针与函数的关系
    1指针作为函数的参数指针作为函数的参数,语法格式:返回数据类型函数名(数据类型*指针变量1,...,数据类型*指针变量1)注意,指针变量的数据类型可以为任何数据类型,包括基本数类型和自定义数据类型代码示例:voidswap(int*ptr1,int*ptr2){//提前保存ptr1指向对象......