ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

一文搞懂C语言中指针、数组、指针数组、数组指针、函数指针、指针函数

2021-10-03 01:31:55  阅读:172  来源: 互联网

标签:func 函数 int void 数组 搞懂 指针


一文搞懂C语言中指针、数组、指针数组、数组指针、函数指针、指针函数

1.背景

阅读redis源码,初始化流程-创建并初始化服务器数据结构中(initServer)

// 设置信号处理函数
signal(SIGHUP, SIG_IGN);
signal(SIGPIPE, SIG_IGN);

signal函数

#include<signal.h>

// signal函数原型
void (*signal (int sign,void (*)(int)))(int);

// second version
typedef void (*sig_t)(int);
sig_t signal(int sign,sig_t func);

singal函数看着有一点绕,先把基本概念搞清楚,就会发现函数结构很清晰

先了解一下基本概念

2.指针 & 数组

指针: 存放某个变量的地址的变量

数组: 在内存中分配的连续的"内存块"

void * // 通用类型指针
&      // 取地址符号
*      // 间接或解引用

在c语言中指针和数组存在千丝万缕的关系,数组中的下标操作都可以使用指针实现

int a[10];
int *pa;
pa = &a[0];            // pa指针,指向数组的首地址
//pa = a;
//a[i],*(a+i),*(pa+i)  都是相同的表示

数组+下标 = 指针 + 偏移

当一个数组名被传递给函数时,实际传递的是起始元素的位置

// 函数定义的形参 , 使用指针和数组是相同的
int func(char[] temp);
int func(char *temp);

3.指针数组 & 数组指针

指针是存放某个变量地址的变量 ----> 指针也是变量,指针也可以存放在数组中

指针数组:指向指针的指针

#define MAXLINES 100
char *linePtr[MAXLINES];   // 指针数组,存放了100个 char* 指针的数组

数组指针:指针存放着一个数组的首地址

4.指针函数 & 函数指针

指针函数:某个函数的返回值是某一个类型的指针,本质上是一个函数

类型说明符 + * + 函数名+ (参数)

int *func(int a,int b);

函数指针: 指向函数的指针变量,本质上是一个指针

类型说明符 + (* 函数名)+ (参数)

int (*func) (int a,int b);

5.再探signal函数

void (*signal (int sign,void (*)(int)))(int);

先拆分

void(*)(int);

函数指针的使用

void func(int a){   // 函数
  a = 5;
}
void (*pfunc)(int); // 函数指针
// pfunc 函数指针 = 它指向的函数就是一个具有void返回值,int参数的函数
pfunc = func;      // pfunc = &func;
// 指针调用函数
pfunc(5);          // (*func)(5)
// 强制类型转换
pfunc = (void (*)(int)) 0x0002;

#define SIG_DFL         (void (*)(int))0
#define SIG_IGN         (void (*)(int))1
#define SIG_HOLD        (void (*)(int))5
#define SIG_ERR         ((void (*)(int))-1)

返回函数指针的函数声明

  • 定义一个函数func,返回值为函数指针;函数有两个输入参数,一个为int,一个是函数指针。
// 类型定义typedef
typedef void(*PFUNC)(int);   // 定义PFUNC为一个  void(*)(int)
PFUNC func(int,PFUNC);

// 不使用typedef进行定义
func(int ,void(*)(int))       // void (*pfunc)(int); // 函数指针
void(* func(int,void(*)(int)))(int)
  
// void (*signal (int sign,void (*)(int)))(int);
// 一个返回函数指针的的函数声名
// 使用函数
signal(SIGHUP, SIG_IGN);   // #define SIGHUP  1       /* hangup */ ; #define SIG_IGN   (void (*)(int))1
signal(SIGPIPE, SIG_IGN);

标签:func,函数,int,void,数组,搞懂,指针
来源: https://www.cnblogs.com/GeekDanny/p/15363183.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有